java异步执行代码 java异步实现

Java中的线程同步与异步如何理解?

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。

十年的武鸣网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整武鸣建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“武鸣网站设计”,“武鸣网站推广”以来,每个客户项目都认真落实执行。

另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

同步就是只能A走完某一段然后停下,让B开始走一段再停下,再让A走。。如此往复。简单理解就是,必须是一段程序执行完后才能执行后面的程序。。

异步就是,同一时间可能A和B同时都在往终点赶,此时不存在先后顺序,就是说,两个程序可以同时执行,称为异步。

Java中的异步网络编程

本文对编写客户服务器应用的java程序员有所帮助 可以解决程序在对方出现故障的时候继续稳定运行 目前java平台已经广泛应用于各类客户/服务器系统中 在实际编程中 往往需要网络的异步处理 比如客户程序 如果客户程序运行先于服务程序 则客户程序则需要在服务程序启动后再自动连接服务程序 在客户程序运行中如果服务程序中途停止 则也需要在不停止的条件下 等待服务程序运行并重新连接 下面提供了一类异步编程的方法

网络异步应用涉及到如下几个关键点

◇ 客户应用启动后 检测服务应用是否存在 如果不存在 则等待服务应用启动 同时不堵塞客户应用其他任务的执行 一旦服务应用启动 客户应用应该及时的与其建立连接 ◇ 客户应用和服务应用在数据通信中 服务应用异常退出后 客户应用应可以检测到服务应用的退出 同时客户应用自动清除该通信链路 回到初始状态 等待服务应用重新启动

该网络异步编程首先涉及到一个定时器和定时器事件 该定时器用于不断的检测网络中客户应用和服务应用是否连通 同时在服务应用出现异常时中止数据通信 返回到初始状态 网络的故障可以通过网络方法的异常处理获知

定时器包含在网络通信类中 使得使用该类的应用感知不到定时器的存在 而方便的处理网络信息

客户程序类如下结构 public class NetComm            implements ActionListener{   javax swing Timer timer = new javax swing Timer( this);       Socket sock;private EventNotifier en;public static int    net_state = ;InetAddress ServerAddr;int ServerPort;   public NetComm(InetAddress addr int port){   ServerAddr = addr;   ServerPort  = port;}

public void NetComm_Init() {           net_state = ;       try {           sock = new Socket(ServerAddr ServerPort);       } catch (IOException e) {           net_state = ;       }       timer start();}   public void NetComm_Data(){   try {       OutputStream outputstream = sock getOutputStream();              BufferedWriter out = new BufferedWriter           (new OutputStreamWriter(outputstream));                  out write( java by ghf@china );       out flush();

BufferedReader in = new BufferedReader               (new InputStreamReader(sock getInputStream()));              boolean more = true;       while(more) {           String str = in readLine();            if(str == null) more = false;           else               // 处理数据                System out println(str);       }                  in close();

} catch (IOException e) {       NetComm_Close();       net_state = ;       }   timer start();   }      public void NetComm_Close()   {       if(sock != null)           try{               sock close();               } catch ( IOException e) {           }   }      public void actionPerformed(ActionEvent e)   {       if(net_state == )              NetComm_Init();       else                   NetComm_Data();   }}

在以上程序中 也可以为外部应用提供一个回调函数 以便在网络异常或恢复正常时通知应用 服务应用的网络通信类类似 可以放在同一类中

lishixinzhi/Article/program/Java/hx/201311/27252

java队列实现异步执行

在整个思路上要调整一下

1、会有很多线程给一个队列上添加任务

2、有一个或者多个线程逐个执行队列的任务

考虑一下几点:

1、没有任务时,队列执行线程处于等待状态

2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其他全部wait

给个小例子吧

package org;

import java.util.LinkedList;

import java.util.List;

public class Queues {

public static ListTask queue = new LinkedListTask();

/**

 * 假如 参数o 为任务

 * @param 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("我被执行了");

}

}

}

package org;

import java.util.List;

public class Exec implements Runnable{

@Override

public void run() {

while(true){

synchronized (Queues.queue) {

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();

for (int i = 0; i  2; i++) {

new Thread(e).start(); //开始执行时,队列为空,处于等待状态

}

//上面开启两个线程执行队列中的任务,那就是先到先得了

//添加一个任务测试

Queues.Task t =new Queues.Task();

Queues.add(t); //执行该方法,激活所有对应队列,那两个线程就会开始执行啦

}

}

上面的就是很简单的例子了


网站栏目:java异步执行代码 java异步实现
网页URL:http://hbruida.cn/article/hgjeji.html