一. 创建线程方式(非线程池)
1. 继承 Thread 并重写 run方法
/**
* 继承 Thread 并重写 run方法
*/
class MyThread extends Thread {
@Override
public void run() {
int max = 20;
for (int i = 0; i < max; i++) {
if (i % 2 == 0) {
System.out.println(getName() + "=====" + i + "优先级: " + getPriority());
}
}
}
}
/**
* @Author: xmq
* @Date:
*/
public class CreateThread {
public static void main(String[] args) {
// 创建线程
MyThread myThread = new MyThread();
// 启动线程, 线程进入可运行状态
myThread.start();
}
}
2. 实现 Runnable 接口, 实现run方法
/**
* 实现 Runnable 接口, 实现run方法
* @Author: xmq
* @Date:
*/
class MyRunnable implements Runnable {
@Override
public void run() {
int max = 20;
for (int i = 0; i < max; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName() + "=====" + i );
}
}
}
}
/**
* @Author: xmq
* @Date:
*/
public class ThreadTest {
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
}
}
3. FutureTask + Callable (可获取返回结果)
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* @Author: xmq
* @Date: 2022/9/22 10:29
*/
public class CallableTest {
public static void main(String[] args) {
FutureTask<String> futureTask = new FutureTask<>(new CallableTestIn());
new Thread(futureTask).start();
try {
// 获取线程返回结果
String res = futureTask.get();
System.out.println("线程返回结果: " + res);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
class CallableTestIn implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("callable: ");
Thread.sleep(5000);
return "hello";
}
}
二. 线程的状态
1. New(新创建)
使用new创建一个新的线程时, 该线程还没有开始运行
2. Runnable (可运行)
调用 start 方法后, 线程处于runnable状态, 一个可运行的线程可能正在运行也可能没有运行
3. Blocked (被阻塞), Waiting (等待), Timed waiting (计时等待)
- 线程试图获取一个对象的内部锁, 而该锁被其他线程所持有, 此时线程进入阻塞状态
- 线程等待另一个线程通知调度器一个条件时, 线程自己进入等待状态
- 调用一些方法(带有超时参数的方法), 调用它们导致线程进入计时等待状态, 这个状态持续到超时或接收适当的通知
4. Terminated (被终止)
- 因为run方法正常退出而死亡
- 因为一个没有捕获的异常终止了run方法而意外死亡