java多线程互斥实战-模拟串口资源互斥
2013-10-20 10:44
441 查看
问题描述:现有一个主线程main,一个子线程online,online线程在启动后,如果没有互斥信号变量,会一直占用某个共享资源-比如串口。当主线程中有需要访问串口资源的时候,需要等待子线程执行完一个串口读写后释放互斥信号变量,才能占用串口资源,主线程执行完串口读写后,释放互斥信号变量,通知子线程继续执行。
举个例子:
子线程有三个块需要不停的访问串口资源,三个块的内部不能中断,需要等待一个块全部执行完,才能中断子线程。
如果这时假设子线程正好执行在第一块的中间,主线程有一个命令需要访问串口资源,那么这时主线程需要进入等待状态,等待子线程执行完一个块释放出互斥信号变量后,主线程才能执行,主线程执行串口访问资源时需要使子线程进入等待状态,当主线程执行完访问串口资源的操作后,释放出互斥信号变量,通知子线程进入执行状态。
子线程代码:
主线程代码:
打印结果如下:
举个例子:
子线程有三个块需要不停的访问串口资源,三个块的内部不能中断,需要等待一个块全部执行完,才能中断子线程。
如果这时假设子线程正好执行在第一块的中间,主线程有一个命令需要访问串口资源,那么这时主线程需要进入等待状态,等待子线程执行完一个块释放出互斥信号变量后,主线程才能执行,主线程执行串口访问资源时需要使子线程进入等待状态,当主线程执行完访问串口资源的操作后,释放出互斥信号变量,通知子线程进入执行状态。
子线程代码:
private static class Online implements Runnable{ private boolean syn_flag=false;//互斥信号量标志 public synchronized boolean isSyn_flag() { return syn_flag; } public synchronized void setSyn_flag(boolean syn_flag) { this.syn_flag = syn_flag; } private synchronized void waitForMutex(){ int i=0; while(syn_flag){ try { if(i<2){ System.out.println("Online thread wait..."); } i++; wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("子线程占用互斥信号量..."); } public synchronized void releaseMutex(){ //释放互斥信号量 System.out.println("主线程执行完成,释放互斥信号量。。。"); setSyn_flag(false); //唤醒等待 System.out.println("通知子线程继续执行。。。"); notify(); } @Override public void run() { // TODO Auto-generated method stub while(true){ //是否需要等待 waitForMutex(); //占用互斥信号量 setSyn_flag(true); for(int i=0;i<10;i++){ System.out.println("Online 第一块"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //释放互斥信号量 System.out.println("子线程释放互斥信号量。。。"); setSyn_flag(false); try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //是否需要等待 waitForMutex(); //占用互斥信号量 setSyn_flag(true); for(int i=0;i<10;i++){ System.out.println("Online 第二块"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //释放互斥信号量 System.out.println("子线程释放互斥信号量。。。"); setSyn_flag(false); try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //是否需要等待 waitForMutex(); //占用互斥信号量 setSyn_flag(true); for(int i=0;i<10;i++){ System.out.println("Online 第三块"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //释放互斥信号量 System.out.println("子线程释放互斥信号量。。。"); setSyn_flag(false); } } }
主线程代码:
public static void main(String[] args) { // TODO Auto-generated method stub //启动子线程 Online online=new Online(); new Thread(online).start(); for(int i=0;i<100;i++){ System.out.println("main thread:"+i); try { Thread.sleep(1200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(i==3||i==10){ //在i==3 i==10时模拟主线程需要操作串口资源。 //此时需要等待子线程执行完串口读写资源,当子线程读写完后会释放互斥信号变量,中断online线程 System.out.println("cmd is comming..."); viewMutex(online); System.out.println("pause the online thread..."); } if(i==7||i==17){ //在i==7 i==17时模拟主线程操作完串口资源。 //此时需要释放互斥信号变量,通知online线程继续执行 online.releaseMutex(); System.out.println("start the online thread..."); } } } public static void viewMutex(Online online){ int i=0; while(online.isSyn_flag()){//有互斥信号量,等待 if(i==0){ System.out.println("有互斥信号量,主线程等待..."); } i++; } //无互斥信号量,占用 online.setSyn_flag(true); System.out.println("主线程占用互斥信号量..."); }
打印结果如下:
main thread:0 子线程占用互斥信号量... Online 第一块0 Online 第一块1 main thread:1 Online 第一块2 main thread:2 Online 第一块3 main thread:3 Online 第一块4 cmd is comming... 有互斥信号量,主线程等待... Online 第一块5 Online 第一块6 Online 第一块7 Online 第一块8 Online 第一块9 子线程释放互斥信号量。。。 主线程占用互斥信号量... pause the online thread... main thread:4 Online thread wait... main thread:5 main thread:6 main thread:7 主线程执行完成,释放互斥信号量。。。 通知子线程继续执行。。。 子线程占用互斥信号量... Online 第二块0 start the online thread... main thread:8 Online 第二块1 main thread:9 Online 第二块2 main thread:10 Online 第二块3 cmd is comming... 有互斥信号量,主线程等待... Online 第二块4 Online 第二块5 Online 第二块6 Online 第二块7 Online 第二块8 Online 第二块9 子线程释放互斥信号量。。。 主线程占用互斥信号量... pause the online thread... main thread:11 Online thread wait... main thread:12 main thread:13 main thread:14 main thread:15 main thread:16 main thread:17 主线程执行完成,释放互斥信号量。。。 通知子线程继续执行。。。 子线程占用互斥信号量... Online 第三块0 start the online thread... main thread:18 Online 第三块1 main thread:19 Online 第三块2 main thread:20 Online 第三块3 main thread:21 Online 第三块4 main thread:22 Online 第三块5 Online 第三块6 main thread:23
相关文章推荐
- java多线程资源互斥访问
- java多线程小例子:模拟两个窗口售票
- java多线程模拟有会话的访问web系统,并记录访问日志
- JAVA学习第六十课 — UDP协议 &基于多线程模拟简单的QQ聊天程序
- Java多线程之模拟一个阻塞队列
- Java多线程设计(二)线程的基本知识(2)共享互斥
- Java基础进阶_day16_(多线程,互斥锁,线程池,定时器,设计模式)
- Java多线程下资源共享
- 【新闻】本人新书《Java多线程编程实战指南(核心篇)》已出版上市
- Java多线程~~~使用信号量来控制资源获取
- Java多线程 之 访问共享资源synchronized、lock(七)
- Java多线程编程模式实战指南(三):Two-phase Termination模式
- JAVA多线程-线程池-实例模拟上厕所问题
- JAVA多线程互斥同步例子
- Java多线程编程--(5)Java多线程互斥小例子
- Java【多线程知识总结(6)】使用Runnable接口创建多线程,处理同一个资源
- Java web 项目中防止资源被盗链下载[参考:Java.Web开发实战1200例]
- 练习-模拟多线程访问资源
- Java学习之:多线程(模拟售票)
- Java【多线程知识总结(10)】线程通信之wait()与notify()的运用--模拟指挥官指挥2个连队交替轰炸战区<另外的写法>