- 进程是受操作系统管理的基本运行单元。
- 线程是在进程中独立运行的子任务。使用多任务操作系统Windows后,可以最大限度地利用CPU的空闲时间来处理其他的任务。使用多线程可以,提高CPU利用率,也就是使用异步,线程被调用的时机是随机的。
- 使用多线程技术时,代码的运行结果与代码执行顺序或调用是无关的。随机性。
- Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。执行start()方法发顺序不代表线程的启动的顺序。
- 共享数据的情况就是多个线程可以访问同一个变量,会出现线程不安全的问题。
- synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。
- 非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时,会出现值被改变,值不同的情况。
- 虽然println()方法在内部是同步的,但i--的操作却是在进入println()之前发生的。
- currentThread()方法可返回代码段正在被哪个线程调用的信息。
- 大多数停止一个线程的操作使用Thread.interrupt()方法,但这个方法不会终止一个正在运行的线程,需要加入一个判断才可以完成线程的停止。
- this.interrupted()测试当前线程是否已经中断。当前线程是指运行this.interrupted()方法的线程。线程中断状态由该方法清除。
- this.isInterrupted()测试线程是否已经中断。测试线程Thread对象是否已经是中断状态,但不清除状态标志。
- 能停止的线程——异常法
public class MyThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
for (int i = 0; i < 500000; i++) {
if(this.isInterrupted()){
System.out.println("已经是停止状态了!我要退出");
throw new InterruptedException();
}
System.out.println("i="+(i+1));
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Run {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(2000);
myThread.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("end");
}
}
- 如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态,使之变成false;
- 建议使用“抛异常”法来实现线程的停止,因为在catch块中可以对异常的信息进行相关的处理,而且使用异常流能更好,更方便地控制程序的运行流程,不至于代码中出现很多个return,造成污染。
- 在使用suspend与resume方法时,如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。也容易出现因为线程的暂停而导致数据不同步的情况。
- yield()方法的作用是放弃当前的cpu资源,将它让给其他的任务去占用cpu执行时间。
- 高优先级的线程总数大部分先执行完,但不代表高优先级的线程全部先执行完。
- 当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程。调用thread.setDaemon(true);设置守护线程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。