Java多线程线程的启动和停止

32次阅读

共计 2521 个字符,预计需要花费 7 分钟才能阅读完成。

线程的启动:

参考官网文档

调用线程的 start 办法,告诉 jvm 虚拟机去调用该线程的 run 办法,后果是两个线程并发的执行,一个是以后线程(调用 start 办法的线程),一个执行 run 办法的线程

如示例:

public class ThreadTest {public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println(Thread.currentThread().getName());
        });
        thread.start();
        System.out.println(Thread.currentThread().getName());
    }
}

打印出两个线程名称为:

main 执行 start 办法 d main 线程
Thread-0  新建的执行 run 办法的线程 0 

留神的点:

1. 多个线程 start 办法的程序并不能决定线程真正执行的程序。

须要期待 CPU 的资源,是异步随机执行的,如下示例:

public class ThreadTest {public static void main(String[] args) {Runnable r = new Runnable() {
            @Override
            public void run() {System.out.println(Thread.currentThread().getName() + ": run");
            }
        };
        Thread thread1 = new Thread(r);
        Thread thread2 = new Thread(r);
        Thread thread3 = new Thread(r);
        Thread thread4 = new Thread(r);
        Thread thread5 = new Thread(r);
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();}
}

打印后果是随机的:

Thread-0: run
Thread-2: run
Thread-1: run
Thread-3: run
Thread-4: run

2.start 办法不能反复调用,哪怕线程曾经执行结束也不能再次执行,否则将抛出线程状态异样,前面说线程的状态能够理解。

3. 和 run 办法的区别:为什么不必 run 办法启动线程

如文档解释,start 办法是以后线程执行 start 办法,通知 jvm 虚拟机用新建的线程是执行 run 办法。而 run 办法就是以后线程之间执行了 run 办法,并没有应用新建的线程。

进行线程:

应用 interrupt() 办法中断线程,须要留神的是,该办法是一个线程去告诉另一个线程去中断,被中断的线程本身决定是否进行,非强行进行;

思考如下

被进行线程更分明该如何进行,比方某个线程 a 正在执行 run 办法,如果其它线程 b 调用了 a 的 interrupt() 办法告诉其进行,a 应该本身决定如何响应,是继续执行,还是纪录一些日志,解决完一个阶段的业务再进行,如果 a 被 b 强制进行,则 a 执行的业务将产生脏数据,安全性较差。所以进行线程的最佳办法就是告诉该线程去进行,该线程能够自行判断本身是否已被中断(

isInterrupted() 办法判断),而后正当响应;stop() 办法,强制进行,已过期;

示例:

public class ThreadTest {public static void main(String[] args) throws InterruptedException {Runnable r = new Runnable() {
            @Override
            public void run() {while (true) {System.out.println("我始终在执行");
                    if (Thread.currentThread().isInterrupted()) {System.out.println("好的,我进行了");
                        break;
                    }
                }
            }
        };
        Thread thread = new Thread(r);
        thread.start();
        Thread.sleep(10);
        thread.interrupt();}
}

打印后果:

...
我始终在执行
我始终在执行
我始终在执行
我始终在执行
我始终在执行
好的,我进行了 

如代码示例,被告诉中断的线程配合做了解决(if 判断)自主决定中断还是继续执行;

进一步思考,如果线程没有在执行,而是在阻塞状态,如下 run 示例:

public void run() {while (true) {System.out.println("我始终在执行");
                    Thread.sleep(10000);
                    if (Thread.currentThread().isInterrupted()) {System.out.println("好的,我进行了");
                        break;
                    }
                }
            }

线程阻塞在 sleep 办法时,这时候内部线程告诉中断,但这里曾经阻塞无奈进到 if 判断,该如何响应,sleep 办法曾经思考到了,这个办法强制要求咱们解决 InterruptedException 异样,即中断异样,来响应内部的中断告诉。

如示例:


public void run() {while (true) {System.out.println("我始终在执行");
                    try {Thread.sleep(10000);
                    } catch (InterruptedException e) {e.printStackTrace();
                        System.out.println("好的我晓得了");
                    }
                    if (Thread.currentThread().isInterrupted()) {System.out.println("好的,我进行了");
                        break;
                    }
                }
            }

另外批改后的办法理论执行的话,while 循环并没有进行,线程并没有完结,这是为什么呢?这是因为抛出异样的同时会将该线程的 isInterrupted 重置为 false;能够查看 InterruptedException 的正文:

抛出 InterruptedException 的时候,会革除是否中断的标记位!

其它

如果 run 办法执行结束或抛出异样,该线程也会进行;

— END —

马上关注    /     码上杂谈

正文完
 0