首页 > 代码库 > 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 多线程之控制线程的方法