Thread与Runable

Posted 金洪光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thread与Runable相关的知识,希望对你有一定的参考价值。

当我们继承Thread的时候可以看出。

调用run()与start()来启动多线程是有区别。

如下我们开启多线程时

MyThread  mt1 = new MyThread(“线程A”);

MyThread  mt1 = new MyThread(“线程A”);

mt1.run():

mt2.run():

发现以上的程序是先执行完mt1后执行mt2,并没有交错运行。也就是说此次线程并没有启动,还是属于顺序式的执行方式。那么我们以star()来启动线程回事如何?

MyThread  mt1 = new MyThread(“线程A”);

MyThread  mt1 = new MyThread(“线程A”);

mt1.start():

mt2.start():

结果中可以发现两个线程是交错运行的。哪个线程先抢到了CPU资源,哪个线程就可以运行。所以程序每次运行输出的顺序式不一样的。单虽然调用的是start()但是最终还是调用的是run()方法。

以下是Start()部分源代码:

当我们调用多次start()时会产生错误。这也是避免了重复调用start()。

还有Thread本身实现了Runable从源代码中可以看出:

如果一个类只能继承Thread类才能实现多线程,则必定受到单线程的局限性。

所以一般来说我们会用Runable接口来完成多线程操作。

那么问题是实现Runable接口的类是没有start()方法的。

Thread提供以构造函数来传递Runable对象。

Public Thread(Runable target);

Public Thread(Runable target,String name);

那么我们可以通过Thread启动实现Runable接口的类了。

new Thread(MyRunable).start();

 

Thread与Runable的重要区别之一是:

Thread不适合于多线程共享资源。

Runable可以方便地实现资源的共享。

class MyThread extends Thread{
private int ticket = 5;
  
public void run(){     for(int i=0;i<5;i++){     if(ticket>0)     System.out.println(“卖票:ticket = “ + ticket--);       }     }   }
public class ThreadDemo{   public static void main(String args[]){     MyThread mt1 = new MyThread();     MyThread mt1 = new MyThread();     MyThread mt1 = new MyThread();     mt1.start();     mt2.start();     mt3.start();   } }

运行结果为依次重复54321三次:

class MyThread implements Runable{

private int ticket = 5;

  public void run(){
    for(int i=0;i<5;i++){
        if(ticket>0)
           System.out.println(“卖票:ticket = “ + ticket--);
      }
    }
  }

public class ThreadDemo{
  public static void main(String args[]){
    MyThread runable = new MyThread();
    new MyThread(runable).start();
    new MyThread(runable).start();
    new MyThread(runable).start();   
  }
}

运行结果你会发现只会输出一次54321:

 简单介绍一下线程状态:

 

以上是关于Thread与Runable的主要内容,如果未能解决你的问题,请参考以下文章

多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

java多线程:继承Thread和实现Runable接口的区别

Callable接口Runable接口Future接口

Java Callable接口Runable接口Future接口

JavaSE学习52:细说多线程之Thread类和Runable接口

FutureTask源码分析