创建线程的两种方式:Thread与Runnable
Thread:
一.Thread线程的创建(四大步骤):
1.新写一个类(MyThread)继承Thread类:
class MyThread extends Thread{
}
2.重写run() 方法,完成线程要执行的任务(ctrl+o或者alt+shift+s快捷键实现run() 方法):
@Override
public void run() {
}
3.创建自定义线程类对象(在main方法里写):
MyThread myThread1=new MyThread();
4.调用start()方法启动线程:
myThread1.start();
我们来看一个案例:
//1.继承Thread类,重写run方法,完成线程要执行的任务
class MyThread extends Thread{
//2.重写run方法,完成线程要执行的任务
@Override
public void run() {
for (int i=0;i<=20;i++){
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println(Thread.currentThread().getName()+"---"+i);
System.out.println(super.currentThread().getName()+"---"+i);//获取当前线程名
}
}
}
public class ThreadTest {
public static void main(String[] args) {
//3.创建自定义线程类对象
MyThread myThread1=new MyThread();
//4.调用start()方法启动线程
myThread1.start();
MyThread myThread2=new MyThread();
myThread2.start();
}
}
运行结果如下:
二.Thread类的方法
编号 | 方法 | 说明 |
---|---|---|
1 | public void start() | 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 |
2 | public void run() | 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
3 | public static Thread currentThread() | 返回对当前正在执行的线程对象的引用。 |
4 | public void interrupt() | 中断线程。 |
5 | public final boolean isAlive() | 测试线程是否处于活动状态。 |
6 | public static void yield() | 暂停当前正在执行的线程对象,并执行其他线程。 |
7 | ublic static void sleep(long millisec) | 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
8 | public final void setPriority(int priority) | 更改线程的优先级。 |
9 | public final void setName(String name) | 改变线程名称,使之与参数 name 相同。 |
10 | public final void setDaemon(boolean on) | 将该线程标记为守护线程或用户线程。 |
11 | public final void join(long millisec) | 等待该线程终止的时间最长为 millis 毫秒。 |
Runnable:
一.Runnable线程的创建(五大步骤):
1.实现Runnable接口:
class MyRunnable implements Runnable{
}
2.覆盖run()方法:
@Override
public void run() {
}
3.创建一个的实例如 task:(写在main方法里)
MyRunnable task=new MyRunnable();
4.通过(task)对象来创建Thread对象
Thread thread=new Thread(task);
5.启动线程
thread.start();
我们再继续来看一个案例:
//1.实现Runable接口
class MyRunnable implements Runnable{
//2.覆盖run()方法
@Override
public void run() {
for (int i=0;i<=20;i++){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"----"+i);//获取当前线程名
}
}
}
public class RunnableTest {
public static void main(String[] args) {
//3.创建MyRunnable的实例
MyRunnable task=new MyRunnable();
//4.通过task对象来创建Thread对象
Thread thread1=new Thread(task);
//5.启动线程
thread1.start();
Thread thread2=new Thread(task);
thread2.start();
}
}
运行结果如下:
Thread和Runnable的区别:
一.相同点:
都重写了run() 方法,调用start方法启动.。
二.不同点:
1.继承Thread类方式,那么这个类就不能再继承别的类,有局限性。
2.实现Runnable接口,还可以继承别的类,避免了单继承的局限性,所以常用Runnable接口
线程的生命周期:
1.新建:新创建了一个线程对象。
2.就绪态:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
3.运行:可运行状态的线程获得了cpu 时间片,执行程序代码。
4.阻塞:阻塞状态是指线程因为某种原因放弃了cpu 使用权,暂时停止运行。直到线程进入可运行状态。
5.死亡:线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。