了解线程

时间:2015-12-21 23:41:58

标签: java multithreading

我正在尝试研究如何从我的public static void main运行NamedRunnable。 我基本上试验了两种运行我的线程的方法,第一种是创建和定义一个线程,下一步是定义一个类,然后实现runnable。

这是我的代码

package threads;

public class Threads extends Thread{
private final String name; // The name of this thread



public static void main(String[] args) {

long lStartTime = System.nanoTime();
Threads greetings = new Threads("Fred");
Threads greetings1 = new Threads("Betty");
NamedRunnable greetings2 = new NamedRunnable("Ralph");//it is here i cant   seem to create an instance of Named Runnable and therefore call start



greetings.start();
greetings1.start();
greetings2.start();



long lEndTime = System.nanoTime();

long difference = lEndTime - lStartTime;

System.out.println("Elapsed time: " + difference);
}
public Threads(String name) { 
    this.name = name; 
} 



public void run() { // The run method prints a message to standard output. 

System.out.println("Greetings from thread ’" + name + "’!"); 

}


public class NamedRunnable implements Runnable { 
    private final String name;
// The name of this Runnable. 
public NamedRunnable(String name) { // Constructor gives name to object. 
    this.name = name; } 
public void run() { // The run method prints a message to standard output. 
    System.out.println("Greetings from runnable ’" + name +"’!"); } }



}  

4 个答案:

答案 0 :(得分:2)

Thread和Runnable有两个不同的东西:

线程是映射到OS线程的对象。在Thread上调用start会分配并执行一个线程。

Runnable描述了要执行的任务。

线程只是执行Runnable的一种方法。您可以使用Thread运行Runnable,如

Runnable myRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
};
new Thread(myRunnable).start();

或者您可以将Runnable提交给ExecutorService并让服务决定如何执行它:

executorService.submit(myRunnable);

或者您可以在当前线程中执行Runnable:

myRunnable.run();

为方便起见,有人决定让Thread实现Runnable,这可能是因为他们可以用稍微少的代码编写演示。

答案 1 :(得分:1)

Runnable传递给Thread以运行它,或使用其他类ExecutorService

new Thread( greetings2 ).start();
顺便说一下,这可能是一个糟糕的主意:

public class Threads extends Thread{
   //...

    public void run() { // The run method prints a message to standard output. 

        System.out.println("Greetings from thread ’" + name + "’!"); 

    }

run()start()等重写方法可能导致各种混淆。当你这样做时,你完全改变了它们的语义(即它们的作用)。使用Thread而不对其进行子类化或使用ExecutorService之类的类。分类Thread就像上个世纪一样。

答案 2 :(得分:1)

其中一个Thread class constructor接受如下所述的Runnable实例:

public Thread(Runnable target)
     

分配一个新的Thread对象。此构造函数与Thread(null,target,gname)具有相同的效果,其中gname是新的   生成的名称。自动生成的名称具有形式   "线程 - " + n,其中n是整数。

     

参数:   target - 启动此线程时调用其run方法的对象。如果为null,则此类run方法不执行任何操作。

所以这样做:

Thread t = new Thread(greetings2);
t.start();

当线程启动时,它会激活你的NamedRunnable.run方法。

答案 3 :(得分:0)

我认为你可以使用ExexutorService来重新启动这个功能,上周我读了一些书,因为java 1.5,这是最好的答案。

  public class LiftOff implements Runnable {
      protected int countDown = 10;
      private static int taskCount = 0;
      private final id = taskCount++; 
      public LiftOff(){}
      public LiftOff(int counDown) {
            this.countDown = countDown;
      }

      public String status() {
      return "#" + id + "(" + (countDown >0 ? countDown : "LiftOff!") + ")";
       }

      public void run() {
       while(countDown-- > 0) {
         System.out.pritln(status);
          Thread.yield();
         }
      }
   }



    public class Test {   
          public static void main(Strig args[]) {
                ExectorService execu = Exector.newCachedThreadPool();
                for(int i = 0; i++) {
                   execu.execute(new LiftOff());
                    execu.shutdown();
                 }

         }
  }