Runnable和Thread比较
1.Runnable 和 Thread区别
Runnable的实现方式是实现其接口即可
第一步:实现Runnable接口,重写run方法
public class MyRunnable implements Runnable{ @Override public void run(){ } }
第二步使用MyRunnable:
new Thread(new MyRunnable).start();
Thread的实现方式是继承其类
public class MyThread extends Thread{ @Override public void run(){
} }
class TestMyThread{
MyThread mythread = new MyThread();
mythread.start();
}
- Runnable接口支持多继承,但基本上用不到
- Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系,不是同类东西,所以Runnable或Thread本身没有可比性。
多线程原理(
转载
作者:itbird01
链接:https://www.jianshu.com/p/333ce4b3d5b8
来源:简书):
相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。
调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。
strart()是启动线程的方法,run()是线程体(内容顺序执行),无论是Runnable还是Thread,都是先启动线程等待Cpu调度,执行线程体。
1.Runnable和Thread相比优点有:
(1)由于Java不允许多继承,因此实现了Runnable接口可以再继承其他类,但是Thread明显不可以
(2)Runnable可以实现多个相同的程序代码的线程去共享同一个资源,而Thread并不是不可以,而是相比于Runnable来说,不太适合
(1)由于Java不允许多继承,因此实现了Runnable接口可以再继承其他类,但是Thread明显不可以
(2)Runnable可以实现多个相同的程序代码的线程去共享同一个资源,而Thread并不是不可以,而是相比于Runnable来说,不太适合
public class Test2 { public static void main(String[] args) { MyThread t1 = new MyThread(); new Thread(t1, "线程1").start(); new Thread(t1, "线程2").start(); } public static class MyThread extends Thread { private int total = 10; @Override public void run() { for (int i = 0; i < 10; i++) { synchronized (this) { if (total > 0) { try { Thread.sleep(100); System.out.println(Thread.currentThread().getName() + "卖票---->" + (this.total--)); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
public class Test3 { public static void main(String[] args) { MyRunable t1 = new MyRunable(); new Thread(t1, "线程1").start(); new Thread(t1, "线程2").start();
//当以Thread方式去实现资源共享时,实际上源码内部是将thread向下转型为了Runnable,实际上内部依然是以Runnable形式去实现的资源共享 } public static class MyRunable implements Runnable { private int total = 10; @Override public void run() { for (int i = 0; i < 10; i++) { synchronized (this) { if (total > 0) { try { Thread.sleep(100); System.out.println(Thread.currentThread().getName() + "卖票---->" + (this.total--)); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } }
2.Runnable为什么不可以直接run
Runnable其实相对于一个Task,并不具有线程的概念,如果你直接去调用Runnable的run,其实就是相当于直接在主线程中执行了一个函数而已,并未开启线程去执行
Runnable其实相对于一个Task,并不具有线程的概念,如果你直接去调用Runnable的run,其实就是相当于直接在主线程中执行了一个函数而已,并未开启线程去执行