Java 带有runnable参数的线程打印名称

Java 带有runnable参数的线程打印名称,java,Java,大家好,我正在努力学习java多线程的基础知识,在学习的过程中我发现了这个练习 public class Test { public static void main(String[] args) { Runnable rrr = () -> Thread.currentThread().setName(args[0]); new print(rrr).start(); } } 本练习要求实现print类,以便以下测试打印args[0]的

大家好,我正在努力学习java多线程的基础知识,在学习的过程中我发现了这个练习

public class Test {

    public static void main(String[] args) {
        Runnable rrr = () -> Thread.currentThread().setName(args[0]);
        new print(rrr).start();
    }
}
本练习要求实现print类,以便以下测试打印args[0]的值

 public class print extends Thread{

     public print(Runnable rrr) {
     }

     public void run()
     {
          System.out.println("run() called by " +      Thread.currentThread().getName());
          System.out.println(Thread.currentThread().getName());
     }
 }

这是我的实现,对吗?

没有使用
Runnable rrr
参数。所以代码不会在任何地方执行。您需要将代码更改为

 public class print extends Thread{

     private Runnable rrr;
     public print(Runnable rrr) {
         this.rrr = rrr;
     }

     public void run()
     {
          rrr.run(); // this runs "Thread.currentThread().setName(args[0])"
          System.out.println("run() called by " +      Thread.currentThread().getName());
          System.out.println(Thread.currentThread().getName());

     }
 }
让它工作


更简单的方法:

Thread t = new Thread(() -> {
    System.out.println("Thread name is " + Thread.currentThread().getName());
});
t.setName("Peter");
t.start();
我的名字是彼得


当线程启动构造函数时,构造函数不需要Runnable,直接调用run方法不使用
Runnable rrr
参数。所以代码不会在任何地方执行。您需要将其存储在一个变量中,然后在另一个
run()
方法中执行
rrr.run()@ShamithaSilva Java8 Lambdaexpression@zapl,我现在觉得自己老了(由此,我在线程“thread-0”java.lang.ArrayIndexOutOfBoundsException:0在Test.lambda$main$0(Test.java:11)在print.run(print.java:23)@lucagianni表示您没有使用参数启动程序。与脚本语言不同,[0]不是程序名,而是实际的第一个参数。因此,如果使用命令行参数,则不会出现错误?@lucagianni yes如果将命令行参数传递给java程序,则将通过
args[0]选择该参数作为第一个参数
并将因此作为threadname打印到控制台,您能解释更多吗?在线程对象上调用start方法时,会自动调用run方法,因此您要执行的代码应该只在run方法中,并且在调用start方法时会自动调用它