线程的生命周期:
指线程从创建到启动,直至运行结束,可以通过调用Thread的相关方法影响线程的运行状态
线程的运行状态::
新建、可执行、运行、阻塞、死亡
yield():若当前线程调用该方法,则由执行状态变成可运行状态
package org.jsoft.Thread;
public class YieldThreadTest extends Thread{
public static void main(String[] args) {
Thread t1 = new YieldThreadTest("线程-1");
Thread t2 = new YieldThreadTest("线程-2");
t1.start();
t2.start();
}
public YieldThreadTest(String name){
super(name);//这的name第什么,threadName就是什么
}
@Override
public void run() {
super.run();
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
if(i%10 == 0){
yield();//让当前进程重新进入到可执行状态,也就是让出了CPU的控制权,谁抢到谁就执行
}
}
}
}
进入阻塞状态下的三种情况:
1.调用sleep方法(使当前线程休眠一段时间,以毫秒为单位)
2.调用join方法(处在执行状态的线程如果调用了其他线程的join方法,将被挂起进入阻塞状态,目标线程执行完毕后才会接触阻塞,回到可执行状态)
3.执行I/0操作-
join()例子:
package org.jsoft.Thread;
public class JoinThreadTest extends Thread{
public static void main(String[] args) {
Thread t1 = new JoinThreadTest();
t1.start();
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
if(i == 10){
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
@Override
public void run() {
super.run();
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
}
}
}
interrupt():可以解除线程的阻塞状态
package org.jsoft.Thread;
public class InterruptThreadTest extends Thread{
public static void main(String[] args) {
InterruptThreadTest t1 = new InterruptThreadTest();
t1.start();
//调用阻塞线程的interrupt方法(线程睡眠时,调用该线程的interrupt方法会抛出interrruptedException)
t1.interrupt();
}
@Override
public void run() {
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
if(i == 10){
try {
Thread.sleep(1000000);//子类不能抛出比父类更大的异常,所以只能try catch
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
isAlive()判断线程是否活着(即非死亡状态):
package org.jsoft.Thread;
public class IsAliveThreadTest extends Thread{
public static void main(String[] args) {
IsAliveThreadTest thread = new IsAliveThreadTest();
System.out.println(thread.isAlive());//false,因为线程还没有执行
thread.start();//进行可执行状态,抢占CPU的资源
System.out.println(thread.isAlive());//true,因为线程执行了
//在当前的main线程中调用thread线程的join()来让thread这个线程运行完毕,挂起当前的main线程
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.isAlive());//false,因为线程执行完毕
thread.start();//线程执行完毕后在开启则会报错:java.lang.IllegalThreadStateException
}
@Override
public void run() {
for(int i = 0; i < 100; i++){
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ":" + i);
}
}
}