从java1.5开始,官方网站推出了类似于执行程序的类。 此类在大量线程处理关键资源时保持稳定性。
让我们从前面的代码开始:
TestRunnable.java
publicclasstestrunnableimplementsrunnable {
私有字符串名称;
publictestrunnable (字符串名称) {
this.name=name;
}
@Override
公共void run (}
while (真) {
if(main.surplus0) )。
返回;
main.surplus----;
system.out.println (name ' ' main.surplus;
}
}
}
main入口
publicstaticvoidmain (字符串[ ] args ) {
testrunnablerunnable=new test runnable (runnable1);
testrunnablerunnable2=new test runnable (runnable2);
threadT1=newthread(runnable );
threadT2=newthread(runnable2);
t1 .开始(;
T2 .开始(;
}
结果
这样,数据一定很混乱。 当然,此时也可以添加同步关键字,但这也有点问题
结果2
这里试图采用java内置的线程管理机制来解决这个问题。 解决此问题的思路可能是,保持线程池,在有请求操作时全部进入线程池,打开一个线程,使其能够按顺序执行请求,并按顺序调用临界资源,这样就安全了。
import Java.util.concurrent.callable;
import Java.util.concurrent.execution exception;
import Java.util.concurrent.executorservice;
import Java.util.concurrent.executors;
import Java.util.concurrent.future;
公共类主{
公共静态输入服务=10;
privateexecutorserviceexecutor=executors.newsinglethreadexecutor (;
void附加任务(runnable runnable ) {
执行程序.执行程序(runnable );
}
vaddtask (可调用可调用) {
futuresubmit=executor.submit (callable;
try {
return submit.get (;
} catch (互联互通) )
system.out.println (中断执行) e.tostring ) );
} catch (执行元素) {
system.out.println (execution exception ) e.tostring );
}
返回空值;
}
publicvoidtestaddtask (字符串名称)。
addtask (新运行) ) }
@Override
公共void run (}
for(intI=0; i 3; I ) {
if (Main.Surplus=0)
返回;
main.surplus----;
system.out.println (name ' ' main.surplus;
}
}
);
}
publicvoidtestaddtask2(字符串名称)。
int count=addtask (新可调用) {
@Override
公共integer call () throws Exception { )。
for(intI=0; i 3; I ) {
if (Main.Surplus=0)
返回0;
main.surplus----;
system.out.println (name ' ' main.surplus;
}
return Main.Surplus;
}
);
}
公共语音关闭(
executor.shutdown (;
}
publicstaticvoidmain (字符串[ ] args ) {
主主=new main (;
main.testaddtask(task1);
main.testaddtask2('task2);
main.testaddtask(task3);
main.testaddtask2(task4);
main.close (;
}
}
在这里,我们定义了两种方法。 分别是addTask、通用的addTask。 这两种方法的实现原理都相同。 一个有回调,另一个没有回调,这取决于项目的需要。
result3
而且,如果分别调用这两种方法,就会发现结果非常有序,不会混乱。
当然,系统为我们提供了这样的类,一定不是为了实现这样的小功能,它有很多功能。 我也在进一步学习中~