目录
三种实现方式:两者都需要重写run()方法
1.继承Thread类
2.是实现Runnable接口
3.callable
线程共有以下6种状态:
新建:当使用new操作符创建新线程时 ---NEW
运行(可运行):当调用start()方法时 ---RUNNABLE
阻塞:当线程需要获得对象的内置锁,而该锁正被别的线程拥有时 ---
计时等待:对于一些含有时间参数的方法,例如Thread类的sleep()方法时等待:当线程等待其他线程通知调度表可以运行时
终止:当run()方法运行完毕或出现异常时
获得进程状态:Thread类的getState()方法可以获得线程的状态,该方法的返回值是Thread.State,它是线程状态的枚举
枚举常量 |
含义 |
NEW |
新建状态 |
RUNNABLE |
运行(可运行)状态 |
BLOCKED |
阻塞状态 |
TIMED_WAITING |
休眠状态 |
WAITING |
等待状态 |
TERMINATED |
终止状态 |
代码:
class ThreadState implements Runnable {
public synchronized void waitForASecond() throws InterruptedException {
wait(500);//使当前线程等待0.5秒或其他线程调用notify()或notifyAll()方法
}
public synchronized void waitForYears() throws InterruptedException {
wait(); //使当前线程永久等待,直到其他线程调用notify()或notifyAll()方法
}
public synchronized void notifyNow() throws InterruptedException {
notify(); //唤醒由调用wait()方法进入等待状态的线程
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
ThreadState state = new ThreadState(); //创建State对象
Thread thread = new Thread(state); //利用State对象创建Thread对象
System.out.println("新建线程:" + thread.getState());// 输出线程状态
thread.start(); //调用thread对象的start()方法,启动新线程
System.out.println("启动线程:" + thread.getState());// 输出线程状态
Thread.sleep(100); //当前线程休眠0.1秒,使新线程运行waitForASecond()方法
System.out.println("计时等待:" + thread.getState());// 输出线程状态
Thread.sleep(1000); //当前线程休眠1秒,使新线程运行waitForYears()方法
System.out.println("等待线程:" + thread.getState());// 输出线程状态
state.notifyNow(); //调用state的notifyNow()方法
System.out.println("唤醒线程:" + thread.getState());// 输出线程状态
Thread.sleep(1000); //当前线程休眠1秒,使新线程结束
System.out.println("终止线程:" + thread.getState());// 输出线程状态
}
}
1.继承Thread类
代码例子:
class MyThread extends Thread{
private String name;
public MyThread(String name) {
this.name=name;
}
@Override
public void run() {
for (int i=0;i<100;i++) {
System.out.println(this.name+i);
}
}
}
public class Demo01 {
public static void main(String[] args) {
MyThread mt1 =new MyThread("线程A:");
MyThread mt2 =new MyThread("线程B:");
MyThread mt3 =new MyThread("线程C:");
MyThread mt4 =new MyThread("线程D:");
mt1.start();
mt2.start();
mt3.start();
mt4.start();
}
}
Runnable
避免单继承局限。在现实工作中最合适。
代码例子:
class MyThread implements Runnable{
private String name;
public MyThread(String name) {
this.name=name;
}
@Override
public void run() {
for (int i=0;i<100;i++) {
System.out.println(this.name+i);
}
}
}
public class Demo01 {
public static void main(String[] args) {
MyThread mt1 =new MyThread("线程A:");
MyThread mt2 =new MyThread("线程B:");
MyThread mt3 =new MyThread("线程C:");
MyThread mt4 =new MyThread("线程D:");
new Thread(mt1).start();
new Thread(mt2).start();
new Thread(mt3).start();
new Thread(mt4).start();
}
}