使用 Runnable 进行并行执行
Using Runnable for parallel execution
我写了这个简单的代码来测试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
。我如何确定两个线程是 运行 并行的?对于给定的输出,它们可能 运行 处于串行模式!
在您给出的示例中,只有一个线程正在启动。
要向 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()
的循环需要生成一个新线程,然后从该线程调用此方法。
How can I be sure that two threads are run in parallel?
如果您知道两个线程都在其中一个完成之前开始,那么您就知道这两个线程是 运行 并发的。
每个线程启动时打印一条消息,每个线程结束时打印一条消息。如果您在看到任何一个结束消息之前都看到了两个开始消息,那么您就知道在第二个开始消息和第一个结束消息之间的时间间隔内两个线程都是可运行的。
我写了这个简单的代码来测试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
。我如何确定两个线程是 运行 并行的?对于给定的输出,它们可能 运行 处于串行模式!
在您给出的示例中,只有一个线程正在启动。
要向 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()
的循环需要生成一个新线程,然后从该线程调用此方法。
How can I be sure that two threads are run in parallel?
如果您知道两个线程都在其中一个完成之前开始,那么您就知道这两个线程是 运行 并发的。
每个线程启动时打印一条消息,每个线程结束时打印一条消息。如果您在看到任何一个结束消息之前都看到了两个开始消息,那么您就知道在第二个开始消息和第一个结束消息之间的时间间隔内两个线程都是可运行的。