java线程Callable问题

我想输出原神,启动和王者,启动但是我的控制台输出确是main启动,

img

代码如下


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();
    }
}


控制台输出

img

引用 皆我百晓生 小程序回复内容作答:

在Java中,为线程设置名称有两种常用方法:

  1. 通过继承Thread类并重写run()方法,然后使用Thread类的构造方法为线程设置名称,例如:
class MyThread extends Thread {
    public MyThread() {
        super("线程名称");
    }
  
    public void run() {
        System.out.println(getName() + "执行");
    }
}
  1. 实现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();
    }
}

在你的第一个代码示例中,你使用了CallableFutureTask来实现线程,这两个类没有直接提供设置线程名称的方法。因此,无法通过这种方法来为线程设置名称。线程的名称将默认为Thread-X,其中X是一个整数。

所以,在你的第一个代码示例中,输出的线程名称实际上是由底层JVM分配的默认线程名称。因此,无论你将Thread对象命名为什么,都无法将它们输出为你所期望的名字。

只有继承Thread类或使用Runnable接口创建线程时,你才能够通过设置线程名称的方式来命名线程。

希望能帮助你理解这个问题。如果你还有其他疑问,请随时提问。

【以下回答由 GPT 生成】

答案:

问题的原因是,在使用Callable时,线程的名称不会直接设置。Callable接口不像Runnable接口那样有一个Thread构造方法中的参数用于设置线程名称。相反,Callable接口是一个独立的任务,它可以由线程池中的线程执行,因此需要一种不同的方式设置线程名称。

要给Java线程Callable设置名称,可以通过以下步骤实现:

  1. 在Callable的实现类中,创建一个成员变量用于保存线程名称,例如private String threadName;

  2. 在Callable实现类的构造方法中,传入一个String参数作为线程名称,并将其赋值给成员变量threadName

  3. 在Callable实现类的call()方法中,使用如下代码将当前线程的名称设置为threadName

Thread.currentThread().setName(threadName);
  1. 在启动线程之前,分别设置Callable实现类的线程名称为"原神"和"王者"。

修改后的代码如下所示:

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设置名称。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^