sleep和wait都可以让线程睡眠
不同:
sleep需要指定时间,而wait可以指定时间,也可以不用指定时间。
sleep时间到了线程就会重新恢复到运行状态。wait如果没有指定时间,必须通过notify、notifyAll方法来唤醒
sleep可以使用同步代码块中,也可以不使用同步代码块中,wait必须使用同步代码块中。
sleep睡眠后不会释放锁,而wait会释放锁。
一般情况下线程要结束,都是通过run方法运行完成,线程就结束了。如果要线程提前中止运行,可以使用stop方法。但是stop方法过时了,原因有不安全因素。stop方法中给出了相应的解决方案:在线程中可以定义一些变量或者标记,然后在线程运行的期间,判断这个变量或者标记,最终让线程执行的仍然运行完成。如果线程长时间处于等待(冻结)状态可以使用interrupt方法来中断这种等待。
interrupt()
其实是把线程这种等待状态给清除,让线程重新恢复到运行状态。
1 //测试线程停止和中断等待 2 3 class Demo implements Runnable 4 { 5 boolean flag = false; 6 public void run() 7 { 8 while( true ) 9 { 10 synchronized( this ) 11 { 12 System.out.println(Thread.currentThread().getName()+"......"+flag); 13 14 try{ this.wait(); }catch(Exception e){} 15 16 if(flag) 17 { 18 break; 19 } 20 } 21 } 22 23 } 24 } 25 class ThreadDemo 26 { 27 public static void main(String[] args) 28 { 29 Demo d = new Demo(); 30 31 Thread t = new Thread(d); 32 Thread t2 = new Thread(d); 33 34 t.start(); 35 t2.start(); 36 37 38 for( int i=0;i<100;i++ ) 39 { 40 System.out.println(Thread.currentThread().getName()+"========"+i); 41 if( i==50 ) 42 { 43 d.flag = true; 44 //清除Thread-0的等待状态 45 t.interrupt(); 46 t2.interrupt(); 47 } 48 } 49 } 50 }
守护线程:后台线程。当我们直接创建的线程,没有设置它的任何属性时,这个线程一般都属于非守护线程(前台线程)。
非守护线程,它和主线程一起执行,当主线程执行完成之后,如果还有其他非守护线程没有执行结束,当前程序依然在正常的运行。
守护线程:它也是用来执行线程任务的,它会随着非守护线程一起执行。当程序中没有任何一个非守护线程在运行时,这时不管有多少个守护线程,它们及时没有执行完成,程序也会自动停止运行。守护线程就自动结束运行了。
线程组:把完成类似功能的线程可以合并在一起,使用一个组来管理当前这些线程,即可以通过组的方式来管理线程。
线程优先级:线程优先级采用数字来标识,从1开始到10,一般情况下会使用1 5 10 来标记当前的线程的优先级
优先级高的线程执行的次数会比优先级低的线程多。优先级高,只能让cpu执行到这个线程的几率变高,而不是说cpu就一直在执行它。
getPriority()
获取当前线程的优先级
setPriority(int newPriority)
设置线程的优先级,newPriority参数可以是1-10!建议设置的时候1 5 10 这三个数字。
守护线程源码:
1 //测试线程停止和中断等待 2 3 class Demo implements Runnable 4 { 5 boolean flag = false; 6 public void run() 7 { 8 int num = 1; 9 while( num<20 ) 10 { 11 System.out.println(Thread.currentThread().getName()+"......"+num++); 12 } 13 } 14 } 15 class ThreadDemo2 16 { 17 public static void main(String[] args) throws InterruptedException 18 { 19 Demo d = new Demo(); 20 21 Thread t = new Thread(d); 22 Thread t2 = new Thread(d); 23 t.setPriority(10); 24 t2.setPriority(1); 25 26 //把2个线程都设置成守护线程 27 t.setDaemon(true); 28 t2.setDaemon(true); 29 t.start(); 30 t2.start(); 31 32 for( int i=0;i<10;i++ ) 33 { 34 System.out.println(Thread.currentThread().getName()+"========"+i); 35 //让主线程临时停顿 36 Thread.yield(); 37 } 38 39 System.out.println("........................."+t); 40 } 41 }
join()
让某个线程强制加入到当前cpu的执行队列中。在使用join加入其他线程到运行状态中来时,这个加入的语句肯定是写在其他的线程的执行代码中。书写加入线程的代码所在的那个线程此时就会处理临时冻结状态,等待被加入的线程执行结束后,它就立刻恢复运行的状态。
yield()
让当前正在执行的临时停顿一下,然后立刻就恢复运行状态。
多线程需要掌握的技术:
1、创建线程的2种方式 继承Thread和实现Runnable接口
2、掌握线程的安全问题发生的原因和解决
3、掌握单生产和单消费的原理以及等待唤醒机制
原文:http://www.cnblogs.com/cb0327/p/4986870.html