线程中Thread和Runnable区别
- 什么是线程
- 基本方法
- 线程的实现方法
- 比较Thread和Runnable
- Thread和Runnable的使用情况
1. 什么是线程
线程是进程中独立运行的子任务,比如我们运行的QQMusic的时候,然后就会有很多的子任务,而且不同的子任务可以共同工作,这时候每一个子任务就是一个线程,多个子任务共同工作,就是多线程。使用多线程,很大程度上缩短了用户等待时间,而且使CPU(中央处理器)的利用率大幅度的降低。
2.基本方法
- yield()方法是让当前抢到cpu的线程退出cup从新进行等待队列
- join()方法超级VIP,直接抢占资源
- interrupt()方法中断sleep线程
- suspend()将线程挂起,不用了,因为容易造成死锁的状态
- resume();将线程恢复执行
- sleep()使线程进入短暂的休眠
- synchronized 锁旗标—放在方法中叫方法同步
线程运行图
3. 线程的实现方法
多线程的编程方式有两种:一是继承Thread类,另一种是实现Runnable接口;
Thread类是实现了Runnable接口,它们之间实现了多态关系;但是有一个弊端,继承只能是单继承的,针对于这种情况,然后实现了Runnable接口。
继承Thread类
package com.lrc.thread;
public class MyThread extends Thread{
public MyThread() {
super();
System.out.println("当前线程的名字:"+Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("当前线程名字:"+Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread mt=new MyThread();
//直接调用MyThread()的构造方法
mt.start();//线程进入可运行状态
System.out.println("运行结束");
}
//先执行MyThread,然后打印运行结束,再执行打印出Thread线程的run方法
//也说明了代码的运行结果与代码的执行顺序或调用顺序是无关的。
}
代码运行效果如下
实现Runnable接口
package com.lrc.thread;
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Runnable运行中");
}
public static void main(String[] args) {
Runnable mr=new MyRunnable();
Thread th=new Thread(mr);
th.start();//进入可运行状态
System.out.println("运行结束");
}
//先执行MyRunnable的方法,打印出“运行结束”,再执行run方法
}
代码运行效果如下
4. 比较Thread和Runnable
- 如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
- main函数,实例化线程对象也有所不同,
extends Thread :t.start();
implements Runnable : new Thread(t).start(); - 使用Runnable,增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
- 线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
5. Thread和Runnable的使用情况
当一个事情分几个人做的时候,用runnable
当不同的事情不同人做的时候,用thread