Java中线程的使用
- 第一种使用方法:继承Thread类:
- 创建自定义类并继承Thread
- 重写Thread的 run() 方法,并编写该线程的业务逻辑代码
1.定义好了⼀个线程类之后,我们就可以通过该类来实例化对象,对象就可以描述⼀个线程。
2. 实例化该对象之后,必须通过调⽤start()来开启该线程,这样该线程才会和其他线程来抢占CPU资源,不能调⽤run()⽅法,调⽤run()相当于普通的实例对象⽅法调⽤,并不是多线程。
使用:
- 实例化自定义线程类的对象,该对象就是一个线程对象,然后启动线程即可。
package thread;
public class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < 1000;i++) {
System.out.println("-------------MyThread-----------");
}
}
}
package thread;
public class Test {
public static void main(String[] args) {
for(int i = 0; i < 1000;i++) {
System.out.println("-----------------Test");
}
MyThread myThread = new MyThread();
myThread.start();
}
}
- 第二种使用方法:实现Runnable接口:
- 创建自定义类并实现Runnable接口
- 实现run方法,编写该线程的业务逻辑代码
- MyRunnable的使⽤与MyThread略有不同:
- MyRunnable相当于定义了线程的业务逻辑,但是它本身不是⼀个线程,所以需要实例化Thread类的对象作为线程,然后将MyRunnable对象赋给Thread对象,这样Thread就拥有了MyRunnable中定义的业务逻辑,再通过调⽤Thread对象的start⽅法来启动线程。
使用:
- 实例化实现类对象,但它并不是一个线程对象,它只是实现了线程要执行的业务逻辑。
- 还需要shi’l线程对象(Thread),将实现类传给线程对象,就会覆盖线程对象继承自父类的 run() 方法。
package thread;
public class MyRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < 1000;i++) {
System.out.println("!===Runnable===!");
}
}
}
package thread;
public class Test2 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
MyThread myThread = new MyThread();
myThread.start();
}
}
注意
- 启动线程需要调⽤线程对象的start⽅法,不能直接调用run() 方法。
- 应该调⽤start⽅法来启动该线程,然后该线程就进⼊了就绪状态,等待系统为其分配CPU资源,⼀旦在时间段内获取到CPU资源,开始执⾏线程的业务逻辑,⾃动调⽤run。
线程的状态
线程共有5种状态,在特定的情况下,线程可以在不同的状态之间完成切换,5种状态如下所示。
- 创建状态: 实例化一个新的线程对象,没有启动。
MyThread myThread = new MyThread();
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
- 就绪状态: 线程对象创建好之后,调用该对象的start方法启动线程,该状态下的线程对象位于可运行线程池 中,等待系统为其分配CPU资源。
myThread.start();
thread.start();
-
运行状态: 就绪状态的线程在某个时间段内获取到了CPU资源,从而执行程序,完成它的任务。
-
阻塞状态: 运行状态的线程因某些原因暂时放弃CPU资源,停止执行程序,并在解除阻塞之后也不能直接回到运行状态,而是重新回到就绪状态,等待获取CPU资源。
-
终止状态: 线程执行完毕或者因为异常退出,该线程的生命周期结束。