------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
多线程
一、停止线程
在JDK 1.5版本之前,有stop停止线程的方法,但升级之后,此方法已经过时。
那么现在我们该如果停止线程呢?
只有一种办法,那就是让run方法结束。
1、开启多线程运行,运行代码通常是循环结构。只要控制住循环,就可以让run方法结束,也就是线程结束。
如:run方法中有如下代码,设置一个flag标记。
public void run(){while(flag){System.out.println(Thread.currentThread().getName()+"....run");}}
那么只要在主函数或者其他线程中,在该线程执行一段时间后,将标记flag赋值false,该run方法就会结束,线程也就停止了。
2、上面的1方法可以解决一般情况,但是有一种特殊情况:就是当线程处于冻结状态。就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。Thread类提供该方法interrupt();
如:
class StopThread implements Runnable{private boolean flag =true;public void run(){while(flag){System.out.println(Thread.currentThread().getName()+"....run");}}public void changeFlag(){flag = false;}}class StopThreadDemo{public static void main(String[] args) {StopThread st = new StopThread(); Thread t1 = new Thread(st); Thread t2 = new Thread(st); t1.start(); t2.start();int num = 0;while(true){if(num++ == 60){t1.interrupt();//清除冻结状态t2.interrupt();st.changeFlag();//改变循环标记break;}System.out.println(Thread.currentThread().getName()+"......."+num);}System.out.println("over");}}
结果:
二、什么时候用多线程?
当某些代码需要同时被执行时,就用单独的线程进行封装。
示例:
class ThreadTest{public static void main(String[] args) {//一条线程new Thread(){public void run(){for (int x=0;x<100 ;x++ ){System.out.println(Thread.currentThread().toString()+"....."+x);}}}.start();//又是一条线程Runnable r= new Runnable(){public void run(){for (int x=0;x<100 ;x++ ){System.out.println(Thread.currentThread().getName()+"....."+x);}}};new Thread(r).start();//可以看作主线程for (int x=0;x<1000 ;x++ ){System.out.println("Hello World!");}}}
扩展:
1、join方法
当A线程执行到了b线程的.join()方法时,A线程就会等待,等B线程都执行完,A线程才会执行。(此时B和其他线程交替运行。)join可以用来临时加入线程执行。
2、setPriority()方法用来设置优先级
MAX_PRIORITY 最高优先级10
MIN_PRIORITY 最低优先级1
NORM_PRIORITY 分配给线程的默认优先级
3、yield()方法可以暂停当前线程,让其他线程执行。