【问题标题】:Multi Threading perform different task in one Run Method多线程在一个运行方法中执行不同的任务
【发布时间】:2015-12-11 13:45:43
【问题描述】:

我是执行多线程的新手。

我想要 2 个不同名称的线程。但这不会发生。它以最后一个作为名称。

这是我的班级代码,它扩展了线程:

    public class Asallik extends Thread {
        public static ArrayList<Thread> t2;
        public static ArrayList<String> str;
        public static ArrayList<Asallik> d;
        public int i = 0;
        public Asallik(String threadName) {
            t2.add(new Thread(this, threadName));
            t2.get(i).start();    
            i++;    
        }

        public static void createThread() {
            str = new ArrayList();
            t2 = new ArrayList();

            for (int i = 0; i < 2; i++) {
                str.add("Thread " + String.valueOf(i));
                d.add(new Asallik(str.get(i)));
            }

        }

        @Override
        public void run() {
            System.out.println("I came " + this.getName());
            if (t2.get(0).getName().equals("Thread 0")) {
                System.out.println("Thread 0 arrived");
            } else if (t2.get(1).getName().equals("Thread 1")) {
                System.out.println("Thread 1 arrived");
            }
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println("Error : " + e);
            }
        }

    }

这里是主要代码:

package deneme2;

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {        
        Asallik.createThread();
    }
}

我试过这种方法,但我做不到。有没有办法在一个运行方法中执行多线程但名称不同?

结果如下:

I came Thread-0
Exception in thread "main" java.lang.NullPointerException
Thread 0 arrived
    at deneme2.Asallik.createThread(Asallik.java:32)
    at deneme2.Main.main(Main.java:19)
Java Result: 1

【问题讨论】:

  • 你的 d ArrayList 是 null 。你必须初始化它。
  • 另外,如果你扩展 Thread 那么你应该实现 Runnable 。或者直接拨打setName(threadName); t2.add(this); start();
  • 我现在开始了。你能给我举个例子吗@WalterM

标签: java multithreading java-threads


【解决方案1】:

希望有帮助

public class Test {

    private class MyRunnable implements Runnable {

        @Override
        public void run() {
            System.err.println("Thread name: " + Thread.currentThread().getName());
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public Test() {
        for (int i = 1; i <= 2; i++) {
            final int f = i;
            ThreadFactory factory = new ThreadFactory() {
                @Override
                public Thread newThread(Runnable r) {
                    return new Thread(r, "Thread Name " + f);
                }
            };
            Thread thread = factory.newThread(new MyRunnable());
            thread.start();
        }
    }

    public static void main(String[] args) {
        new Test();
        while (true) {
            // Wait all threads print their names
        }
    }

}

【讨论】:

  • 我不明白为什么会有while (true)
【解决方案2】:
public Asallik(String threadName) {

    //this class extends Thread so you can call Thread methods
    setName(threadName);
    t2.add(this);
    start();
    //I changed everything above this comment to the next

    i++;
}

public static void createThread() {
    str = new ArrayList();
    t2 = new ArrayList();
    d = new ArrayList(); //initialize d <-------------------
    for (int i = 0; i < 2; i++) {
        str.add("Thread " + String.valueOf(i));
        d.add(new Asallik(str.get(i)));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2016-02-21
    • 2023-01-31
    • 2020-12-03
    相关资源
    最近更新 更多