一个线程的生命周期:
新建状态-----start()----->就绪状态-----run()----->运行状态-----执行结束\stop----->死亡状态
| |
<------------阻塞状态<------------
等待阻塞(wait)、同步阻塞(synchronized)、其他阻塞(sleep或join或I/O请求)
1、若线程未执行结束,则isAlive()返回true.
2、调用一个线程的interrupt()来请求中断该线程,若线程被请求中断,则interrupted()方法返回true.
3、在当前线程中调用sleep()方法,可以等待一定时间.
4、在当前线程中调用另一个线程的join()方法,会将当前线程与该线程合并,若该线程未结束,则当前线程进入阻塞态直到该线程执行结束.
线程的优先级:
Java线程的优先级是一个整数,其取值范围是1到10(默认值为5),通过setPriority()设置优先级.
Thread.MIN_PRIORITY 为 1
Thread.NORM_PRIORITY为 5
Thread.MAX_PRIORITY 为 10
用户线程和守护线程:
jvm启动后通常有一个用户线程(从main方法启动).我们可以通过setDaemon(true)将线程设置为守护线程.
在创建子线程时,子线程会继承当前线程的状态.
JVM遇到如下情况时会终止运行: 1、exit函数被调用. 2、所有的用户线程都结束了(只存在守护线程)
创建线程的三种方法: 实现Runnable接口、继承Thread、Callable和Future创建异步线程
1、通过实现Runnable接口
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Runnable打印");
}
}
public static void main(String[] args)
{
MyRunnable myRunnable = new MyRunnable();
Thread th1 = new Thread(myRunnable);
Thread th2 = new Thread(myRunnable);
th1.start();
th2.start();
}
2、通过继承Thread类
class MyThread extends Thread{
@Override
public void run() {
System.out.println("MyThread线程打印");
}
}
public static void main(String[] args)
{
MyThread th = new MyThread();
th.start();
}
3、通过Callable和Future创建异步线程
class MyCallable implements Callable<String>{//这里通过范式来确定返回值类型
@Override
public String call() throws Exception {
String valueString = "MyCallable返回值";
Thread.sleep(1000);
return valueString;
}
}
public static void main(String[] args)
{
//创建可调用对象
MyCallable myCallable = new MyCallable();
//创建异步任务,注意返回值类型要和调用对象的返回值类型一致
FutureTask<String> futureTask = new FutureTask<>(myCallable);
//创建一个线程去执行这个异步任务
new Thread(futureTask).start();
try {
//调用get获取线程返回值,若线程未执行完则等待线程执行
System.out.println("子线程的返回值:"+futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}