我想输出原神,启动和王者,启动但是我的控制台输出确是main启动,
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
class CallableClass implements Callable<Object> {
@Override
public Object call() throws Exception {
return "null";
}
}
class Demo4{
public static void main(String[] args) {
CallableClass c1 = new CallableClass();
FutureTask<Object> futureTask = new FutureTask<>(c1);
Thread thread = new Thread(futureTask,"原神");
thread.start();
System.out.println(Thread.currentThread().getName()+"启动!");
FutureTask<Object> futureTask1 = new FutureTask<>(c1);
Thread thread1 = new Thread(futureTask1,"王者");
thread1.start();
System.out.println(Thread.currentThread().getName()+"启动!");
}
}
有人能讲讲怎么回事吗?我是根据Runnable学的将对象添加到Thread的构造方法里就能够为这个线程起一个名字,类似于这样
class RunnableClass implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行!");
}
}
class Demo3{
public static void main(String[] args) {
RunnableClass runnableClass= new RunnableClass();
//使用Thread的构造方法创建对象
Thread thread = new Thread(runnableClass,"thread666");
thread.start();
}
}
控制台输出
引用 皆我百晓生 小程序回复内容作答:
在Java中,为线程设置名称有两种常用方法:
Thread
类并重写run()
方法,然后使用Thread
类的构造方法为线程设置名称,例如:class MyThread extends Thread {
public MyThread() {
super("线程名称");
}
public void run() {
System.out.println(getName() + "执行");
}
}
Runnable
接口,在实例化Thread
对象时为其传入Runnable
实例,并使用Thread
类的构造方法为线程设置名称,例如:class MyRunnable implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName() + "执行");
}
}
public class Demo {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable, "线程名称");
thread.start();
}
}
在你的第一个代码示例中,你使用了Callable
和FutureTask
来实现线程,这两个类没有直接提供设置线程名称的方法。因此,无法通过这种方法来为线程设置名称。线程的名称将默认为Thread-X
,其中X
是一个整数。
所以,在你的第一个代码示例中,输出的线程名称实际上是由底层JVM分配的默认线程名称。因此,无论你将Thread
对象命名为什么,都无法将它们输出为你所期望的名字。
只有继承Thread
类或使用Runnable
接口创建线程时,你才能够通过设置线程名称的方式来命名线程。
希望能帮助你理解这个问题。如果你还有其他疑问,请随时提问。
【以下回答由 GPT 生成】
答案:
问题的原因是,在使用Callable时,线程的名称不会直接设置。Callable接口不像Runnable接口那样有一个Thread构造方法中的参数用于设置线程名称。相反,Callable接口是一个独立的任务,它可以由线程池中的线程执行,因此需要一种不同的方式设置线程名称。
要给Java线程Callable设置名称,可以通过以下步骤实现:
在Callable的实现类中,创建一个成员变量用于保存线程名称,例如private String threadName;
。
在Callable实现类的构造方法中,传入一个String参数作为线程名称,并将其赋值给成员变量threadName
。
在Callable实现类的call()
方法中,使用如下代码将当前线程的名称设置为threadName
:
Thread.currentThread().setName(threadName);
修改后的代码如下所示:
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class CallableClass implements Callable<Object> {
private String threadName;
public CallableClass(String threadName) {
this.threadName = threadName;
}
@Override
public Object call() throws Exception {
Thread.currentThread().setName(threadName);
return "null";
}
}
class Demo4 {
public static void main(String[] args) {
CallableClass c1 = new CallableClass("原神");
FutureTask<Object> futureTask = new FutureTask<>(c1);
Thread thread = new Thread(futureTask);
thread.start();
System.out.println(Thread.currentThread().getName() + "启动!");
CallableClass c2 = new CallableClass("王者");
FutureTask<Object> futureTask1 = new FutureTask<>(c2);
Thread thread1 = new Thread(futureTask1);
thread1.start();
System.out.println(Thread.currentThread().getName() + "启动!");
}
}
运行修改后的代码,输出应该为:
main启动!
原神启动!
main启动!
王者启动!
通过以上步骤,你可以成功给Java线程Callable设置名称。
【相关推荐】