主应用实现 Runnable |并发编程方法 2
先决条件: Java中并发编程的不同方法
让我们详细看看第二种方法。
- 用户拥有实现runnable的主类,这是对编译器的承诺,即该类将具有run方法。
public class MyClass implements Runnable{ public void run(){ } }
- 然后,用户使用this关键字将对主应用程序的引用传递给执行方法。
taskList.execute(this)
这是向编译器传达的一种方式,即当它开始运行特定任务时,将其称为相应的运行方法。
- 与方法一相比,这种方法的优势在于 run 方法可以调用主应用程序中的方法,包括私有方法。
- 与第一种方法相比,这种方法的缺点是竞争条件。我们将 run 方法放在主应用程序中的原因是它可以在主应用程序中处理数据。如果用户启动了多个线程并且他们同时修改了相同的共享数据,则需要担心竞争条件。其次,没有构造函数使得传递构造函数参数变得非常困难,因此每个类都以相同的方式开始。
- 示例代码:用户在主类中实现runnable,同一个类还有一堆其他的方法来制作任务队列和调用execute方法。
以下是方法一中解释的反例的方法二实现:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// Concurrent Programming in action
public class MainAppRunnable implements Runnable {
private final int loopLimit;
// Limit till which the counter will run
private MainAppRunnable(int loopLimit)
{
this.loopLimit = loopLimit;
}
private void startThreads()
{
// Made the task queue
ExecutorService taskList
= Executors.newFixedThreadPool(2);
// Added these to the task queue
// and made available for execution
taskList.execute(this);
taskList.execute(this);
taskList.execute(this);
taskList.execute(this);
taskList.execute(this);
// Stopped new tasks from being
// added to the task queue
taskList.shutdown();
}
@Override
public void run()
{
for (int i = 0; i < loopLimit; i++) {
System.out.println(
Thread.currentThread().getName()
+ " Counter: " + i);
}
// Called private method that is
// part of the same application
pause(Math.random());
}
// Methods that run uses can be private
// in this approach
private void pause(double seconds)
{
try {
Thread
.sleep(Math.round(seconds * 1000.0));
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
// Driver method
public static void main(String[] args)
{
new MainAppRunnable(3).startThreads();
}
}
输出:
pool-1-thread-1 Counter: 0
pool-1-thread-2 Counter: 0
pool-1-thread-1 Counter: 1
pool-1-thread-1 Counter: 2
pool-1-thread-2 Counter: 1
pool-1-thread-2 Counter: 2
pool-1-thread-2 Counter: 0
pool-1-thread-2 Counter: 1
pool-1-thread-2 Counter: 2
pool-1-thread-2 Counter: 0
pool-1-thread-2 Counter: 1
pool-1-thread-2 Counter: 2
pool-1-thread-1 Counter: 0
pool-1-thread-1 Counter: 1
pool-1-thread-1 Counter: 2