Java 理解线程

Java 理解线程,java,multithreading,Java,Multithreading,我正在尝试解决如何从我的公共静态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) {

我正在尝试解决如何从我的公共静态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 +"’!"); } }



}  

Runnable
传递给
线程
以运行它,或者使用另一个类,如
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
的类。子分类
线程
与上个世纪类似。

可运行
传递给
线程
以运行它,或者使用另一个类,如
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
的类。子分类
线程
与上个世纪类似。

此处提到的可接受可运行实例之一:

分配一个新的线程对象。此构造函数与线程(null、target、gname)具有相同的效果,其中gname是一个新的 生成的名称。自动生成的名称的格式如下所示 “线程-”+n,其中n是一个整数

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

所以你要这样做:

Thread t = new Thread(greetings2);
t.start();
当线程启动时,它将启动您的
NamedRunnable.run
方法。

此处提到的accepts Runnable实例之一:

分配一个新的线程对象。此构造函数与线程(null、target、gname)具有相同的效果,其中gname是一个新的 生成的名称。自动生成的名称的格式如下所示 “线程-”+n,其中n是一个整数

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

所以你要这样做:

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

当线程启动时,它将启动您的
NamedRunnable.run
方法。

线程和Runnable是两件不同的事情:

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

Runnable描述要执行的任务

线程只是执行可运行线程的一种方式。您可以使用线程运行Runnable,如中所示

Runnable myRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
};
new Thread(myRunnable).start();
或者,您可以向ExecutorService提交Runnable,并让该服务决定如何执行它:

executorService.submit(myRunnable);
也可以在当前线程中执行Runnable:

myRunnable.run();

为了方便起见,有人决定让线程实现可运行,这样他们就可以用更少的代码编写演示

线程和可运行是两件不同的事情:

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

Runnable描述要执行的任务

线程只是执行可运行线程的一种方式。您可以使用线程运行Runnable,如中所示

Runnable myRunnable = new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
};
new Thread(myRunnable).start();
或者,您可以向ExecutorService提交Runnable,并让该服务决定如何执行它:

executorService.submit(myRunnable);
也可以在当前线程中执行Runnable:

myRunnable.run();

为了方便起见,有人决定让线程实现可运行,这样他们就可以用更少的代码编写演示

我想你可以使用ExexutorService来重新体验这个功能,上周,我读了一些书,从Java1.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();
                 }

         }
  }

我想你可以使用ExexutorService来重新体验这个功能,上周,我读了一些书,因为java1.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();
                 }

         }
  }

您好,我似乎无法使其工作,但我不想扩展我希望实现runnableHello的线程我似乎无法使其工作,但是我不想扩展线程,我希望实现runnable@Nathan Hughes..这是我想了解的段落thread类有一个构造函数,它的参数是runnable。当实现Runnable接口的对象被传递给该构造函数时,线程的run()方法将从Runnable调用run()方法,调用线程的start()方法将创建一个新的控制线程,在其中执行Runnable的run()方法。@Mr Assistance:“调用线程的start()方法将创建一个新的控制线程,在该线程中执行Runnable的run()方法:“这是正确的,您没有得到什么?因此,基本上Runnable接口定义了一个方法,public void run(),正如您在第一段代码中强调的那样。@MrAssistance:yes,这就是它的全部内容。非常感谢您的帮助-现在有了意义@Nathan Hughes..Thread类有一个以Runnable为参数的构造函数,这是我试图了解的段落。当实现Runnable接口的对象被传递给该构造函数时,线程的run()方法将从Runnable调用run()方法,调用线程的start()方法将创建一个新的控制线程,在其中执行Runnable的run()方法。@Mr Assistance:“调用线程的start()方法将创建一个新的控制线程,在该线程中执行Runnable的run()方法:“这是正确的,您没有得到什么?因此,基本上Runnable接口定义了一个方法,public void run(),正如您在第一段代码中强调的那样。@MrAssistance:yes,这就是它的全部。非常感谢你的帮助-现在它是有意义的