目录
1.线程的创建
start()方法用于创建并执行线程.它与run()方法的区别是: run()方法是一个特殊方法,相当于线程的入口,其中是线程要实现的逻辑,它一般都是通过系统自动调用,而不是我们手动去调用.且它不会创建一个新的线程.而调用start()方法会先使用操作系统API去创建一个新的线程,然后该新的线程会去调用run()方法.
●示例代码
Thread thread = new Thread(() -> {
System.out.println("thread1");
});
//1.线程的创建
thread.start();
注:如果需要查看线程是否创建成功,可以通过jdk的bin目录下的jconsole.exe查看(只能查看在运行中的线程).
2.线程的中断(终止)
嘿嘿,在之前使用的stop()方法,但是现在已经弃用,根据jdk帮助文档可以知道:
现在我们通过interrupt()来中断线程,其中断步骤分为两步:首先,设置中断标志位为true(默认为false),其次,如果线程正在阻塞中(正在执行sleep()方法),则会唤醒阻塞状态,就会以抛异常的方式中断线程,但是它不会直接中断线程,而是让我们自己选择是否中断线程.
这么讲可能有点抽象,大家可能一时之间不能理解,我们看一下示例代码:
●示例代码
抛异常我们没有中断线程:
Thread thread = new Thread(() -> {
//得到当前线程实例,用isInterrupted()方法去判断线程是否发生中断
while (!Thread.currentThread().isInterrupted()) {
System.out.println("thread1");
try {
//sleep识别到中断标志位为true,则会抛出InterruptedException异常
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
//抛异常让我们决定是否中断线程
//如果我们没有中断线程,那么在抛完线程后,线程会继续执行(sleep()方法会将中断标志位重新变为false)
// break;
}
}
System.out.println("线程中断");
});
//得到线程的状态
System.out.println(thread.getState());
//1.线程的创建
thread.start();
//2.线程的中断
//2.1将中断标志位设为true
System.out.println(thread.getState());//线程正在执行
Thread.sleep(3000);//三秒后中断线程
thread.interrupt();
Thread.sleep(3000);//三秒后打印线程的状态
System.out.println(thread.getState());//线程中断(terminated)
● 运行结果:
线程会在抛异常后继续执行,反之我们选择中断线程(break注释取消),线程则不会继续执行:
注:在唤醒阻塞状态后,sleep()方法会自动将中断标志位设为false.
3.线程的等待
去游乐场玩旋转木马,每个木马都有人坐了,我们就只能等待某一个人玩的时间到了,我们再去玩.当然也有可能我们到玩旋转木马的地方,刚好有个空位,我们就可以无需等待,直接去玩.因为多个线程之间是并发运行的,且调度顺序不确定.我们就可以让线程A先等待线程B执行完毕后再去执行.这样可以保证线程A一定在线程B后面执行.我们这里使用的是join()方法.(在哪个线程中调用则哪个线程等待,哪个线程调用则等待的是谁,比如我在主线程中调用thread.join(),那么就是主线程等thread线程执行完毕后再执行.),具体可以看示例代码及运行结果.
● 示例代码
Thread thread = new Thread(() -> {
//得到当前线程实例,用isInterrupted()方法去判断线程是否发生中断
while (!Thread.currentThread().isInterrupted()) {
System.out.println("thread1");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
System.out.println("线程中断");
});
//3.线程的等待
thread.join();//主线程等待thread线程执行完毕后再执行
while (true) {
Thread.sleep(3000);
System.out.println("main");
}
● 运行结果:
没有规定谁等待谁,thread线程和主线程并发执行,调度顺序随机.
thread1一直在执行,而主线程处于等待中.
4.线程的休眠
当一个线程执行时,如果我们可以给它设置休眠时长.(如果不设置休眠时长,那么线程会执行的非常快,有的时候可能会错过我们需要查看的打印信息).这里我们使用sleep()方法.对应参数为时间长度(单位为毫秒).
● 示例代码
while (true) {
try {
Thread.sleep(3000);//让主线程每三秒执行一次
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main");
}
注:sleep是类方法,不属于某个Thread类对象,直接用类名.sleep()调用.示例代码中线程休眠的异常于main方法
5.获取当前线程实例
在给大家解释线程中断的时候,我们用到了currentThread()方法,用于获取当前线程实例,该方法也是属于类方法,而不属于某个Thread对象.
我们可以得到当前正在执行的线程,然后通过getId(),getState(),getName()等方法对它的id,状态,名称等属性进行获取.
分享完毕~