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();
}

 

  1. Runnable接口支持多继承,但基本上用不到
  2. 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来说,不太适合
  
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,其实就是相当于直接在主线程中执行了一个函数而已,并未开启线程去执行




posted @ 2020-05-31 15:58  木子李和三点水  阅读(755)  评论(0编辑  收藏  举报