- 进程是受操做系统管理的基本运行单元。
- 线程是在进程中独立运行的子任务。使用多任务操做系统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);设置守护线程。