通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理.异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间换时间的做法,例如在计算机当中,高速缓存作为cpu和磁盘io之间的缓冲地带协调cpu高速计算能力和磁盘的低速读写能力.
(1):重新启动一个java程序就启动了一个进程
可以用操作系统命令行启动 Runtime.getRuntime().exec("java -classpath . XXX");
list的小例子:
Java codeclass MessageConsumer extends Thead { ? ?private ListYourMessageType list; ? ?private boolean running = true; ? ?public MessageConsumer(ListYourMessageType list) {this.list = list;} ? ?public void run() { ? ? ? ?while (running) { ? ? ? ? ? ?YourMessageType msg = null; ? ? ? ? ? ? try { ? ? ? ? ? ? ? ?synchronized(list) { ? ? ? ? ? ? ? ? ? ?while (list.size() == 0) { ? ? ? ? ? ? ? ? ? ? ? ?list.wait(); ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ?msg = list.remove(0); ? ? ? ? ? ? ? ? ? ?list.notiryAll(); ? ? ? ? ? ? ? ?} ? ? ? ? ? ?} catch (Exception e) { ? ? ? ? ? ? ? ?e.printStackTrace(); ? ? ? ? ? ?} ? ? ? ? ? ?if (msg == null) continue; ? ? ? ? ? ?//System.out.println(msg); //print message ? ? ? ?} ? ?}}//调用sampleclass ShareModule { ? ?ListYourMessageType list = new ArrayListYourMessageType(); ? ?...}public class Main { ? ?public static void main(String[] args) { ? ? ? ?ShareMudule sm; //so on ? ? ? ?... ? ? ? ?Thread t = new MessageConsumer(sm.list); ? ? ? ?t.start(); ? ? ? ?... ? ?}}
① 使用wait和notify方法
这个方法其实是利用了锁机制,直接贴代码:
public class Demo1 extends BaseDemo{ private final Object lock = new Object(); @Override public void callback(long response) { System.out.println("得到结果"); System.out.println(response); System.out.println("调用结束"); synchronized (lock) { lock.notifyAll(); } } public static void main(String[] args) { Demo1 demo1 = new Demo1(); demo1.call(); synchronized (demo1.lock){ try { demo1.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("主线程内容"); } }
可以看到在发起调用后,主线程利用wait进行阻塞,等待回调中调用notify或者notifyAll方法来进行唤醒.注意,和大家认知的一样,这里wait和notify都是需要先获得对象的锁的.在主线程中最后我们打印了一个内容,这也是用来验证实验结果的,如果没有wait和notify,主线程内容会紧随调用内容立刻打印;而像我们上面的代码,主线程内容会一直等待回调函数调用结束才会进行打印.
没有使用同步操作的情况下,打印结果:发起调用 调用返回 主线程内容 得到结果 1 调用结束
而使用了同步操作后:
和方法一的原理类似:
基本上和方法一没什么区别,只是这里使用了条件锁,两者的锁机制有所不同.
在整个思路上要调整一下
①.、会有很多线程给一个队列上添加任务
考虑一下几点:
①.、没有任务时,队列执行线程处于等待状态
给个小例子吧
package?org;
import?java.util.LinkedList;
import?java.util.List;
public?class?Queues?{
public?static?ListTask?queue?=?new?LinkedListTask();
/**
*?假如?参数o?为任务
*/
public?static?void?add?(Task?t){
synchronized?(Queues.queue)?{
Queues.queue.add(t);?//添加任务
Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来
}
static?class?Task{
public?void?test(){
System.out.println("我被执行了");
public?class?Exec?implements?Runnable{
@Override
public?void?run()?{
while(true){
while(Queues.queue.isEmpty()){?//
try?{
Queues.queue.wait();?//队列为空时,使线程处于等待状态
}?catch?(InterruptedException?e)?{
e.printStackTrace();
System.out.println("wait...");
Queues.Task?t=?Queues.queue.remove(0);?//得到第一个
t.test();?//执行该任务
System.out.println("end");
public?static?void?main(String[]?args)?{
Exec?e?=?new?Exec();
new?Thread(e).start();?//开始执行时,队列为空,处于等待状态
//上面开启两个线程执行队列中的任务,那就是先到先得了
//添加一个任务测试
Queues.Task?t?=new?Queues.Task();
Queues.add(t);?//执行该方法,激活所有对应队列,那两个线程就会开始执行啦
上面的就是很简单的例子了
以上就是土嘎嘎小编为大家整理的异步java代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!