首页 > 代码库 > java 22 - 7 多线程之控制线程的方法
java 22 - 7 多线程之控制线程的方法
线程休眠(让线程休息一会再运行)
public static void sleep(long millis)
在自定义线程类中添加该方法。
更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设置的是休眠1秒),再进行一轮。
一轮:(如果测试类调用了3个线程,那么就是随机运行3次为一轮)
如:
哈士奇:1,日期:Wed Oct 05 21:01:19 CST 2016
短尾猫:1,日期:Wed Oct 05 21:01:19 CST 2016
萨摩耶:1,日期:Wed Oct 05 21:01:19 CST 2016
休息1秒,继续:
萨摩耶:2,日期:Wed Oct 05 21:01:20 CST 2016
哈士奇:2,日期:Wed Oct 05 21:01:20 CST 2016
短尾猫:2,日期:Wed Oct 05 21:01:20 CST 2016
1 public class ThreadSleep extends Thread { 2 @Override 3 public void run() { 4 for (int x = 0; x < 100; x++) { 5 System.out.println(getName() + ":" + x + ",日期:" + new Date()); 6 // 睡眠 7 // 稍微休息1秒钟 8 try { 9 Thread.sleep(1000);//由于父类没有抛出异常,所以得try{}catch(){}10 } catch (InterruptedException e) {11 e.printStackTrace();12 }13 }14 }15 }
线程加入
public final void join():等待该线程终止。 这个方法是在测试类上添加的
也就是说,得等这个线程运行结束,别的线程才能运行
以下代码就是,哈士奇先数完0-99,萨摩耶和短尾猫才能运行。。。二哈真6
public class ThreadJoinDemo { public static void main(String[] args) { ThreadJoin tj1 = new ThreadJoin(); ThreadJoin tj2 = new ThreadJoin(); ThreadJoin tj3 = new ThreadJoin(); tj1.setName("哈士奇"); tj2.setName("萨摩耶"); tj3.setName("短尾猫"); tj1.start(); try { tj1.join();//由于父类没有抛异常,所以得try{}catch(){} } catch (InterruptedException e) { e.printStackTrace(); } tj2.start(); tj3.start(); }}
线程礼让
public static void yield(); :暂停当前正在执行的线程对象,并执行其他线程。
让多个线程的执行更和谐,但是不能靠它保证全部的和谐(即是哈士奇运行一次,萨摩耶运行一次,短尾猫运行一次)。
这个方法不能完全保证,有可能哈士奇连续运行几次。二哈继续6。。
该方法在测试类中添加:
1 public class ThreadYield extends Thread {2 @Override3 public void run() {4 for (int x = 0; x < 100; x++) {5 System.out.println(getName() + ":" + x);6 Thread.yield();7 }8 }9 }
守护线程
public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
通俗易懂地说:守护线程是用来保护别的非守护线程的,如果其它非守护线程都停止了,守护线程自身也必须停止
(保护的人挂了,守护者也得挂,不过守护者得到消息再挂,所以受保护者挂了以后,守护者会继续执行几次再挂)
代码:
1 //这个代码中,刘备一运行完毕,张飞关羽跟着再运行几次,就停止 2 public class ThreadDaemonDemo { 3 public static void main(String[] args) { 4 ThreadDaemon td1 = new ThreadDaemon(); 5 ThreadDaemon td2 = new ThreadDaemon(); 6 7 td1.setName("关羽"); 8 td2.setName("张飞"); 9 10 // 设置守护线程11 td1.setDaemon(true);12 td2.setDaemon(true);13 14 td1.start();15 td2.start();16 17 Thread.currentThread().setName("刘备");18 for (int x = 0; x < 5; x++) {19 System.out.println(Thread.currentThread().getName() + ":" + x);20 }21 }22 }
再来个配图:坦克大战
中断线程
public final void stop():让线程停止,过时了,但是还可以使用。
替代stop的:
public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。
自定义多线程类:
public class ThreadStop extends Thread { @Override public void run() { System.out.println("开始执行:" + new Date()); // 休眠10秒钟 try { Thread.sleep(10000); } catch (InterruptedException e) { // e.printStackTrace(); System.out.println("线程被终止了"); } System.out.println("结束执行:" + new Date()); }}
测试类:
1 public class ThreadStopDemo { 2 public static void main(String[] args) { 3 ThreadStop ts = new ThreadStop(); 4 try { 5 Thread.sleep(3000); 6 // ts.stop(); //过了3秒后,关闭ThreadStop线程, 7 ts.interrupt(); //中断线程。 把线程的状态终止,并抛出一个InterruptedException 8 } catch (InterruptedException e) { 9 e.printStackTrace();10 }11 }12 }
public void interrupt():的执行结果:
开始执行:Wed Oct 05 21:58:44 CST 2016
线程被终止了
结束执行:Wed Oct 05 21:58:47 CST 2016
java 22 - 7 多线程之控制线程的方法