首页 > 编程知识 正文

Java同步方法,java线程同步的方法

时间:2023-05-05 03:45:43 阅读:50987 作者:3410

从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

而且,如果分别调用这两种方法,就会发现结果非常有序,不会混乱。

当然,系统为我们提供了这样的类,一定不是为了实现这样的小功能,它有很多功能。 我也在进一步学习中~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。