- 浏览: 163059 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mengyue0477:
最后还不忘吐槽一下 哈哈 太逗了
spring容器的懒加载lazy-init设置 -
comet0515:
不是maven工程能不能用checkstyle插件?job是一 ...
jenkins 配置checkstyle -
xfxlch:
http://docs.spring.io/spring-bo ...
NoteBook -
With_Me_Forever:
太浅了。我最近也在看着方面的资料,一起进步把。
互联网金融定义 -
xfxlch:
在http://r.m.baidu.com/6pmxgig
NoteBook
编程实现:
子线程循环10次,主线程循环100次,子线程再循环10次,主线程再循环100次,如此线程间交替执行50个轮回。
首先我们要有主子两个线程来分别执行10,100次的循环操作,这个相对来说简单:
TraditionalThreadCommuniction.class 是我的类名
上面这样就可以子线程和主线程就可以完成各自的循环任务了。
但是这样做并没有达到,主子线程都各自执行一次,然后轮回50次的要求。为此我们要对我们的代码进行改造。
首先我们对我们的主子线程任务进行抽象,把线程任务放到一个统一的类里,进行统一处理。
如下:
这是面向对象编程的思路,把相关业务处理类放到一个class里,其他业务方法只要调方法就就可以了,做到业务对外来应用的一个透明。
当然这样做还是不够的,并没有到达两个线程间通信和相互协作的目的。
通常为了让两者之间通信,我们需要添加一个变量bSubTread=true,当子线程执行好的时候,我们让子线程停下来,并且通知主线程去执行任务,主线程跑完之后,主线程再自己停下来,通知子线程去执行。如此才能达到我们最初的目的
最后的代码就是这个样子了:
子线程循环10次,主线程循环100次,子线程再循环10次,主线程再循环100次,如此线程间交替执行50个轮回。
首先我们要有主子两个线程来分别执行10,100次的循环操作,这个相对来说简单:
TraditionalThreadCommuniction.class 是我的类名
public static void main(String[] args) { new Thread(new Runnable() { public void run() { // 子线程执行 for (int j = 0; j < 50; j++) {// 轮回50次 synchronized (TraditionalThreadCommuniction.class) { for (int i = 0; i < 10; i++) { System.out.println("sub thread id " + i); } } } } }).start(); // 主线程执行 for (int j = 0; j < 50; j++) {// 轮回50次 synchronized (TraditionalThreadCommuniction.class) { for (int i = 0; i < 100; i++) { System.out.println("main thread id " + i); } } } }
上面这样就可以子线程和主线程就可以完成各自的循环任务了。
但是这样做并没有达到,主子线程都各自执行一次,然后轮回50次的要求。为此我们要对我们的代码进行改造。
首先我们对我们的主子线程任务进行抽象,把线程任务放到一个统一的类里,进行统一处理。
如下:
public static void main(String[] args) { final Bisuness bisuness = new Bisuness(); new Thread(new Runnable() { public void run() { // 子线程执行 for (int j = 0; j < 50; j++) {// 轮回50次 bisuness.sub(j); } } }).start(); // 主线程执行 for (int j = 0; j < 50; j++) {// 轮回50次 bisuness.main(j); } } static class Bisuness { public synchronized void sub(int j) { for (int i = 0; i < 10; i++) { System.out.println("sub thread id " + i + " loop id " + j); } } public synchronized void main(int j) { for (int i = 0; i < 100; i++) { System.out.println("main thread id " + i + " loop id " + j); } } }
这是面向对象编程的思路,把相关业务处理类放到一个class里,其他业务方法只要调方法就就可以了,做到业务对外来应用的一个透明。
当然这样做还是不够的,并没有到达两个线程间通信和相互协作的目的。
通常为了让两者之间通信,我们需要添加一个变量bSubTread=true,当子线程执行好的时候,我们让子线程停下来,并且通知主线程去执行任务,主线程跑完之后,主线程再自己停下来,通知子线程去执行。如此才能达到我们最初的目的
最后的代码就是这个样子了:
public static void main(String[] args) { final Bisuness bisuness = new Bisuness(); new Thread(new Runnable() { public void run() { // 子线程执行 for (int j = 0; j < 50; j++) {// 轮回50次 bisuness.sub(j); } } }).start(); // 主线程执行 for (int j = 0; j < 50; j++) {// 轮回50次 bisuness.main(j); } } static class Bisuness { boolean bSubTread = true; public synchronized void sub(int j) { if(!bSubTread) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 10; i++) { System.out.println("sub thread id " + i + " loop id " + j); } bSubTread = false; this.notify(); } public synchronized void main(int j) { if(bSubTread){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i = 0; i < 100; i++) { System.out.println("main thread id " + i + " loop id " + j); } bSubTread = true; this.notify(); } }
- TraditionalThreadCommuniction.zip (767 Bytes)
- 下载次数: 0
发表评论
-
eclipse project .setting
2016-08-24 11:30 567有一个文件在.setting的目录下面: 文件名:org.ec ... -
jar命令工具
2016-01-23 20:29 615背景: 今天介绍两个jar的命令工具,对我个人来说,还是比较好 ... -
Java的按值传递
2016-01-23 19:30 515问题: 最近在看Mar ... -
Mac OS 安装java 开发环境
2016-01-03 13:00 1739我的机器是: 1. jdk1.7下载安装 jdk7:h ... -
记一次Java Rest Service Hang住的经历
2015-12-28 20:08 2656背景: 在前后端分开开发的过程中,前段的页面要调用后台Java ... -
一个String字符串的问题2
2015-12-14 14:22 570背景: 今天遇到个问题: String str = & ... -
我读重构这本书
2015-12-01 22:30 0第一点:关注变量命名。好的变量名能让读者更快更好的理解程序到底 ... -
系统log的编写
2015-11-16 09:41 0log很关键,一定要记录好对追踪问题有帮助的日志。 -
CAS 授权问题
2015-11-16 09:40 0CAS 授权问题 -
Caused by: java.lang.UnsupportedOperationException 解决方案
2015-10-21 22:09 4005背景: 今天在跑一个UnitTest,跑的过程中想在list ... -
LogBack 框架里log-access的使用
2015-10-18 16:05 7017背景: 想通过配置log-access来实现直接使用浏览器来访 ... -
how to fix "org.hamcrest.CoreMatchers.containsString cannot be resolved"
2015-09-23 23:12 2984背景: 山姆大叔比较喜欢用一些新的技术和新的特性,最近在jun ... -
java 打印金字塔
2015-08-24 00:53 739背景: 一个同事,面试应聘者喜欢用学校里学过的一个书本或者课后 ... -
纯jsp servlet 实现 upload file功能
2015-08-17 20:35 689本篇主要是简单的实现jsp servlet 的上传文件的功能, ... -
dos 命令窗口執行java 命令,帶包路徑
2015-07-26 12:16 512記錄一下,是為了自己下次再run java命令的時候,可以很快 ... -
tomcat 远程调试
2015-07-23 18:41 450背景: 我们在项目开发过程中,很多时候会遇到这样的情况:项目在 ... -
使用android studio 来开发hello world app的时候,遇到的一些坑。
2015-07-13 01:38 2099使用android studio 来开发h ... -
ThreadLocal
2015-05-11 07:22 381Java线程:深入ThreadLocal ThreadLo ... -
Hibernate Interceptor(拦截器)
2015-04-28 20:30 2357需求: 对所有操作数据库的事件,添加audit log, 此l ... -
eclipse 加入tomcat 包
2015-03-24 01:09 402...
相关推荐
线程间的通信一般采用四种方式:全局变量方式、消息传递方式、参数传递方式和线程同步法。线程间通信最简单的一种方法是使用全局变量,这用的就是全局变量的方式。
线程间通信方式3:消息传递方式的演示。采用计算演示线程的执行,并采用用户界面线程来实时显示执行的进度,线程间的通信方式采用了3种方式相结合,对多线程间的通信有比较好的学习和研究价值。
采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...
该程序是我写的博客“一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)”的配套程序,共享给大家使用
线程间通信方式2:参数传递方式。通过3类线程的创建方法,演示了给线程传递方式的方式,包括;单参数、多参数和类3类。
Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制
文档详细介绍了Handler实现线程间通信过程中源码的实现机制,并对其中的Looper,MessageQueue,Message对象的初始化及sendMessage()通过sendMessageDelayed()和sendMessageAtTime()过程的操作机流程
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
多进程和多线程是系统执行多任务机制的重要手段,多任务同时进行自然少不了相互之间的通信工作。下面先将线程间的通信方式总结一下,便于大家对比学习。
主要描述了android的线程间通信的原理和应用
多线程线程间通信,可用于控制线程内部函数,做处理......................................................
Qt线程之间通信、线程和进程之间通信实例,简单易懂
Android界面利用线程间通信,同步更新时间。
VC多线程例程七及图解文档(线程间通信) 含源源码
先进软件测试技术线程间通信求和逆序源代码
关于Java线程间通信-回调
线程间通信.emmx
多线程的几个例子,例子中有线程的打开,暂停,停止和线程间通信,VC6环境打开并调试。
android 线程间通信的介绍,非常实用。
1.10 第三章进程线程间通信