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异步实现
文章源于:http://azwzsj.com/article/hgjeji.html