logo头像
Snippet 博客主题

线程

线程

1. 线程的3种实现方式

线程的 3 种实现方式:

  • 继承 Thread 类
  • 实现 Runnable 接口
  • 实现 Callable 接口

通过 Runnable 和 Callable 接口实现的类,
必须依靠 Thread 来启动,不是真正意义上的线程,可以当做线程任务看待,代码实现如下:

1 继承Thread类

1
2
3
4
5
6
7
8
9
10
public class MyThread extends Thread{// 继承Thread类
  public void run(){
  // 重写run方法
  }
}
public class Main {
  public static void main(String[] args){
    new MyThread().start();//创建并启动线程
  }
}

2 实现Runnable接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyThread2 implements Runnable {// 实现Runnable接口
  public void run(){
  // 重写run方法
  }
}
public class Main {
  public static void main(String[] args){
    // 创建并启动线程
    MyThread2 myThread=new MyThread2();
    Thread thread=new Thread(myThread);
    thread().start();
    // 或者简写
new Thread(new MyThread2()).start();
  }
}

实现接口比继承 Thread 类具有优势,因为接口是多实现, Thread 类单继承

实现接口会更好一些,

3 实现Callable接口

Callable和Runnable区别

执行方法不同,call() 、run()
Callable的 call() 方法 可以返回值和抛出异常 ,通过 Future 对象进行封装

1
2
3
4
5
6
7
8
9
10
11
//Callable  启动线程方式
class ThreadDemo implements Callable<Integer> {
public Integer call() throws Exception { return null;}
}
public class Test {
public static void main(String[] args) {
ThreadDemo td = new ThreadDemo();
FutureTask<Integer> result = new FutureTask<Integer>(td);
new Thread(result).start();
}
}

2 线程状态和生命周期

线程状态总共6个:new、runnable、blocked、waiting、timed_waiting、terminated

线程状态:

  • NEW:创建后尚未启动的线程处于此状态。
  • RUNNABLE:正在Java虚拟机中执行的线程,或正在等待 CPU 时间片线程处于此状态。
  • BLOCKED:被阻塞等待监视器锁定的线程处于此状态。
  • WAITING:等待其它线程显式地唤醒,否则不会被分配 CPU 时间片的线程处于此状态。
  • TIMED_WAITING:无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒的线程处于此状态。
  • TERMINATED:已退出的线程处于此状态。

thread

线程生命周期:new、runnable、running、blocked、dead

  • new:新建状态,处于新生状态,有自己的内存,尚未运行,此时不是活着的
  • runnable:就绪状态,线程已启动,正等待被分配CPU时间片
  • running:运行状态,
  • blocked:阻塞状态,
    • 正在睡眠:使用sleep(long t),睡眠指定时间后可进入就绪状态
    • 正在等待:使用wait(),可调用notify()/notifyAll(),恢复到就绪状态
    • 被另一个线程阻塞:调用suspend(),可调用resume()方法恢复
  • dead:死亡状态,分正常死亡或异常终止
支付宝打赏 微信打赏

打赏