使用Runnable进行并行执行

时间:2017-05-20 09:16:37

标签: java multithreading runnable

我编写了这个简单的代码来测试Runnable接口。

    import java.util.List;
    import java.util.ArrayList;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    class myClass implements Runnable{
      private final List< String >[] ls;
      private int n;
      public myClass(int m) 
      { 
        n = m;
        ls = new List[n];
        for (int i = 0; i < n; i++) {
          ls[i] = new ArrayList<>();
        }
      }
      public void run()
      {
        try {
          for (int i = 0; i < n; i++) {
            pleasePrint( ls[i] );
          } 
        } catch (Exception e) {
            System.out.println("error");
        }
      }
      public void init() {

        ls[0].add("1");  ls[0].add("2");  ls[0].add("3");
        ls[1].add("4");  ls[1].add("5");  ls[1].add("6");
      }
      void pleasePrint( List< String > ss )
      {
        for (int i = 0; i < ss.size(); i++) {
          System.out.print(ss.get(i)); // print the elements of one list
        }
      }
    }

    public class Threadtest {
      public static void main(String[] args) {
        myClass mc = new myClass(2);
        mc.init();
        ExecutorService te = Executors.newCachedThreadPool();
        te.execute(mc);
        te.shutdown();
      }
    }

当我运行代码时,它将打印123456。如何确保两个线程并行运行?使用给定的输出可能它们以串行模式运行!

2 个答案:

答案 0 :(得分:1)

在您给出的示例中,只启动了一个线程。

要向ExecutorService提交多个任务,请使用submit()方法:

ExecutorService te = Executors.newCachedThreadPool();
te.submit(task);
te.submit(anotherTask);
// Some code
te.shutdown();

要检查(出于学习目的)线程是否独特,请在run()中打印线程的名称:

String name = Thread.currentThread().getName();

解决我的头脑

public void run() {
    String name = Thread.currentThread().getName();
    System.out.println(name);

    // Do Something
}

如果我将相同的实例提交给ExecutorService两次:

public static void main(String[] args) {
    myClass mc = new myClass(2);
    mc.init();
    ExecutorService te = Executors.newCachedThreadPool();
    te.submit(mc);
    te.submit(mc);
    te.shutdown();
}

然后输出:

pool-1-thread-1
1
2
3
4
5
6
pool-1-thread-2
1
2
3
4
5
6

注意:我将print()更改为println()并在run()中打印了该帖子的名称。

希望这有帮助。

更新#1

要从不同的线程打印列表,您需要更改方法。调用pleasePrint()的循环需要生成一个新线程,然后从该线程调用此方法。

答案 1 :(得分:0)

  

如何确保两个线程并行运行?

你知道如果你知道两个线程在其中一个线程完成之前就已经开始并发运行了两个线程。

每个线程启动时打印一条消息,并在每个线程结束时打印一条消息。如果在看到任一结束消息之前看到两个启动消息,那么您就知道在第二个启动消息和第一个结束消息之间的间隔期间两个线程都可以运行。