Java线程(我这样做正确吗?)

Java线程(我这样做正确吗?),java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,我想创建并启动5个java线程。线程应该显示消息,然后停止执行。我这样做对不对 public class HelloThread extends Thread { private String thread_name; // constructor HelloThread(String tname) { thread_name = new String(tname); } // override method run() pub

我想创建并启动5个java线程。线程应该显示消息,然后停止执行。我这样做对不对

public class HelloThread extends Thread {
    private String thread_name;

    // constructor
    HelloThread(String tname) {
        thread_name = new String(tname);
    }

    // override method run()
    public void run() {
        setName(thread_name);
        System.out.println(" Thread " + thread_name); //assigning each thread a name 
    }

    public static void main(String args[]) {
        for (int i = 1; i < 6; i++) {
            HelloThread mythr_obj = new HelloThread(i + " says Hello World!!! ");
            mythr_obj.start(); // start execution of the thread object
        }
    }
}
公共类HelloThread扩展线程{
私有字符串线程名称;
//建造师
HelloThread(字符串tname){
线程名称=新字符串(tname);
}
//重写方法run()
公开募捐{
设置名称(线程名称);
System.out.println(“Thread”+Thread_name);//为每个线程分配一个名称
}
公共静态void main(字符串参数[]){
对于(int i=1;i<6;i++){
HelloThread mythr_obj=新HelloThread(i+“向世界问好!!!”);
mythr_obj.start();//开始执行线程对象
}
}
}

您是否尝试编译和运行此代码?它看起来是正确的,不过我建议将您的
main
方法放在一个单独的类中。

您是否尝试过编译和运行此代码?它看起来是正确的,不过我建议将您的
main
方法放在一个单独的类中。

您是否尝试过编译和运行此代码?它看起来是正确的,不过我建议将您的
main
方法放在一个单独的类中。

您是否尝试过编译和运行此代码?它看起来是正确的,不过我建议将您的
main
方法放在一个单独的类中。

是的。您做得很好,但正如@FSQ所建议的,您的整个类本身就是一个线程。您可以将main方法放在任何其他类中。

是。您做得很好,但正如@FSQ所建议的,您的整个类本身就是一个线程。您可以将main方法放在任何其他类中。

是。您做得很好,但正如@FSQ所建议的,您的整个类本身就是一个线程。您可以将main方法放在任何其他类中。

是。您做得很好,但正如@FSQ所建议的,您的整个类本身就是一个线程。您可以将main方法放在任何其他类中。

自从java 1.4中引入
java.util.concurrent
库以来,开发人员现在很少创建自己的
线程
实例

今天,你更有可能这样做

ExecutorService threadPool = Executors.newFixedThreadPool(5);

List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 20; ++ i) {
    Callable<Integer> callable = () -> {
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Returning " + i);
        return i;
    };
    Future<Integer> future = threadPool.submit(callable);
    futures.add(future);
}
for (Future<Integer> future : futures) {
    Integer result = future.get();
    System.out.println("Finished " + result);
}

threadPool.shutdown();
ExecutorService线程池=Executors.newFixedThreadPool(5);
列表期货=新的ArrayList();
对于(int i=0;i<20;++i){
可调用可调用=()->{
时间单位。秒。睡眠(1);
System.out.println(“返回”+i);
返回i;
};
Future=threadPool.submit(可调用);
期货。添加(期货);
}
for(未来:未来){
整数结果=future.get();
系统输出打印项次(“完成”+结果);
}
threadPool.shutdown();

自从java 1.4中引入
java.util.concurrent
库以来,开发人员现在很少创建自己的
线程
实例

今天,你更有可能这样做

ExecutorService threadPool = Executors.newFixedThreadPool(5);

List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 20; ++ i) {
    Callable<Integer> callable = () -> {
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Returning " + i);
        return i;
    };
    Future<Integer> future = threadPool.submit(callable);
    futures.add(future);
}
for (Future<Integer> future : futures) {
    Integer result = future.get();
    System.out.println("Finished " + result);
}

threadPool.shutdown();
ExecutorService线程池=Executors.newFixedThreadPool(5);
列表期货=新的ArrayList();
对于(int i=0;i<20;++i){
可调用可调用=()->{
时间单位。秒。睡眠(1);
System.out.println(“返回”+i);
返回i;
};
Future=threadPool.submit(可调用);
期货。添加(期货);
}
for(未来:未来){
整数结果=future.get();
系统输出打印项次(“完成”+结果);
}
threadPool.shutdown();

自从java 1.4中引入
java.util.concurrent
库以来,开发人员现在很少创建自己的
线程
实例

今天,你更有可能这样做

ExecutorService threadPool = Executors.newFixedThreadPool(5);

List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 20; ++ i) {
    Callable<Integer> callable = () -> {
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Returning " + i);
        return i;
    };
    Future<Integer> future = threadPool.submit(callable);
    futures.add(future);
}
for (Future<Integer> future : futures) {
    Integer result = future.get();
    System.out.println("Finished " + result);
}

threadPool.shutdown();
ExecutorService线程池=Executors.newFixedThreadPool(5);
列表期货=新的ArrayList();
对于(int i=0;i<20;++i){
可调用可调用=()->{
时间单位。秒。睡眠(1);
System.out.println(“返回”+i);
返回i;
};
Future=threadPool.submit(可调用);
期货。添加(期货);
}
for(未来:未来){
整数结果=future.get();
系统输出打印项次(“完成”+结果);
}
threadPool.shutdown();

自从java 1.4中引入
java.util.concurrent
库以来,开发人员现在很少创建自己的
线程
实例

今天,你更有可能这样做

ExecutorService threadPool = Executors.newFixedThreadPool(5);

List<Future<Integer>> futures = new ArrayList<>();
for (int i = 0; i < 20; ++ i) {
    Callable<Integer> callable = () -> {
        TimeUnit.SECONDS.sleep(1);
        System.out.println("Returning " + i);
        return i;
    };
    Future<Integer> future = threadPool.submit(callable);
    futures.add(future);
}
for (Future<Integer> future : futures) {
    Integer result = future.get();
    System.out.println("Finished " + result);
}

threadPool.shutdown();
ExecutorService线程池=Executors.newFixedThreadPool(5);
列表期货=新的ArrayList();
对于(int i=0;i<20;++i){
可调用可调用=()->{
时间单位。秒。睡眠(1);
System.out.println(“返回”+i);
返回i;
};
Future=threadPool.submit(可调用);
期货。添加(期货);
}
for(未来:未来){
整数结果=future.get();
系统输出打印项次(“完成”+结果);
}
threadPool.shutdown();


不需要
新字符串(tname)
,为什么要复制该字符串?否则,你做得对吗?好吧,它做了你期望它做的事吗?我的意思是,这只是一个“Hello World”风格的程序,在设计上没有多少错误。如果这段代码真的编译了,我建议你在codereview.stackexchange.com上询问,因为可能的答案在这里可能太广泛/基于观点了。@AndyBrown这并不是代码审查的主题,因为这篇文章似乎只包含示例代码。即使它编译并运行了,它也是离题的,因为CR是用来检查真实代码的。@SuperBiasedMan-很公平,尽管我们现在知道真正的问题是什么:“我不确定它是创建多个线程还是一次创建一个线程然后停止”,所以它的性质有所改变。@OldCurmudgeon-它们不是守护线程,这样就可以看到println了。不需要
新字符串(tname)
,为什么要复制该字符串?否则,你做得对吗?好吧,它做了你期望它做的事吗?我的意思是,这只是一个“Hello World”风格的程序,在设计上没有多少错误。如果这段代码真的编译了,我会