-
创建线程的3种方式
(1)继承Thread类创建线程类
//创建线程
public class MyThread1 extends Thread { //定义Thread的继承类
@Override
public void run() { //重写run()方法
//线程执行体
}
}
//执行线程
public static void main(string[] args) {
new MyThread1().start(); //创建并启动第1个线程
new MyThread1().start(); //创建并启动第2个线程
}
(2)实现Runnable接口创建线程类
//创建线程
public class MyThread2 implements Runnable { //定义Runnable接口的实现类
@Override
public void run() { //重写run()方法
//线程执行体
}
}
//执行线程
public static void main(string[] args) {
var mt = new MyThread2(); //创建Runnable接口实现类的对象
new Thread(mt, "新线程1").start(); //创建并执行第1个线程(命名为“新线程1”)
new Thread(mt, "新线程2").start(); //创建并执行第2个线程(命名为“新线程2”)
}
(3)实现Callable接口创建线程类
//创建线程
public class MyThread3 implements Callable<int> {
@Override
public int call() throws Exception {
//线程执行体
return 0;
}
}
//调用线程
public static void main(String[] args) {
//创建线程池(通过实现Callable接口来实现线程类,通常配合线程池使用)
ExecutorService executorService = Executors.newCachedThreadPool();
//将Callable实例的对象放进线程池,并返回一个Future对象
Future<Int> future = executorService.submit(new MyThread3());
//调用Future对象的get()方法可获取返回值(调用后线程处于阻塞状态,直到call()方法执行完成)
System.out.println(future.get());
}
-
3种创建方式的比较
继承Thread类 | 实现Runnable接口 | 实现Callable接口 | |
返回值 | 无 | 无 | 有 |
异常抛出 | 不可 | 不可 | 可 |
复杂度 | 简洁 | 较复杂 | 复杂 |
继承 | 不可继承其他类 | 可继承其他类,适用于多个线程处理同一个资源 | |
访问 | 可用this访问当前线程 | 需用Thread.currentThread()访问当前线程 |
-
线程的6种状态
Thread.state反映了线程的6种状态:
(1)NEW - 新建状态(尚未执行)
(2)RUNNABLE - 运行状态(执行或就绪,由JVM线程调度器安排)
(3)BLOCKED - 阻塞状态
(4)WAITING - 等待状态(无限等待)
(5)TIMED_WAITING - 限时等待状态
(6)TERMINATED - 终止状态(执行完或被终止)
说明:
(1)调用线程对象的isAlive()方法,可获取线程的状态。运行、阻塞、等待状态返回true,新建和终止状态返回false。
(2)线程应该调用start()方法执行,不可直接调用run()方法或call方法执行,否则只能执行单线程。
(3)线程只有在新建状态时,才可调用start()方法执行,其他状态下都不可再次调用start()方法。
-
线程的3种同步机制
(1)同步代码块
public class MyThread4 extends Thread {
//定义同步锁
private Object obj;
@Override
public void run() {
//使用同步锁
synchronized (obj) {
//线程执行体(同步代码块)
}
}
}
(2)同步方法
public class MyClass1 {
//定义一个线程安全的方法(用到synchronized修饰符)
public synchronized void myWork() {
}
}
public class MyThread6 extends Thread {
private MyClass1 mc;
@Override
public void run() {
//使用同步锁
mc.myWork();
}
}
(3)同步锁(是对同步方法的显式使用)
public class MyClass2 {
//定义锁对象
private final ReentrantLock lock = new ReentrantLock();
//定义一个线程安全的方法
public void myWork() {
lock.lock(); //加锁
try {
//线程执行体
} finally {
lock.unlock(); //释放锁
}
}
}
public class MyThread7 extends Thread {
private MyClass2 mc;
@Override
public void run() {
//使用同步锁
mc.myWork();
}
}
-
几个常用的线程类方法
方法名 | 返回值 | 参数 | 说明 |
getName() | String | 无 | 获取线程名称 |
getPriority() | int | 无 | 获取线程优先级 |
getState() | Thread.status | 无 | 获取线程状态 |
setName() | void | String:名称 | 设置线程名称 |
setPriority() | void | int:优先级 | 设置线程优先级 |
interrupt() | void | 无 | 中断此线程 |
join() | void | 无 | 等待该线程死亡 |
sleep() | void | int:毫秒 | 使当前正在执行的线程休眠 |