- 浏览: 2737970 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1313)
- JS (65)
- CSS (6)
- html (30)
- dweamweaver工具相关 (2)
- Spry (1)
- DB (103)
- p2p (1)
- java (405)
- .net (3)
- oracle (24)
- struts (18)
- myeclipse (15)
- linux (49)
- SQL SERVER2008 (101)
- jsp (21)
- resume (1)
- other (1)
- ajax (3)
- 云计算 (2)
- excel (32)
- vss (1)
- 警戒 (1)
- eclipse (21)
- c (1)
- dialog designer (7)
- axis1.4 (4)
- webservice (11)
- CTI (1)
- svn (8)
- spring (27)
- tomcat (13)
- log4j (14)
- 网络应用 (7)
- mysql (59)
- bat (4)
- jdbc (1)
- 正式表达式 (1)
- hibernate (27)
- iphone (2)
- 系统应用 (107)
- servlet (3)
- vmware (2)
- php (12)
- JQuery (30)
- avaya (5)
- postgresql (19)
- java面试 (1)
- rose (1)
- Socket (1)
- xml (2)
- PowerDesign (3)
- visio (1)
- jstl (4)
- informix (2)
- assemble (2)
- English Study (2)
- IOS (9)
- CMMI (1)
- outlook (4)
- poi (1)
- hadoop (5)
- SAE (3)
- jor (1)
- jquery mobile (1)
- git (11)
- mina (1)
- ibatis (2)
- wordpress (2)
- 支付宝 (1)
- struts2 (14)
- apns (1)
- html5 (1)
- xampp (2)
- uml (2)
- 项目管理 (1)
- 敏捷开发 (1)
- 设计模式 (2)
- spark (1)
- maven (9)
- 微信公众平台 (1)
- json (2)
- junit (1)
- quartz (2)
- redis (2)
- memcache (1)
- android (3)
- 红杏 (1)
- postman (1)
- mybatis (5)
- iplat4j (1)
- windows (1)
- logback (1)
- Netty (1)
- wiki (1)
- dubbo (1)
- sonar (2)
- jenkins (2)
- mac (10)
- office (4)
- groovy (1)
- intellij (6)
- zookeeper (2)
- 诛仙 (1)
- MQ (2)
- docker (1)
- 2222 (0)
最新评论
-
代码改变生活:
虽然代码敲的头疼的要命,但是依然要感谢你,感谢您共享!!!!开 ...
jxl读取excel日期相差8小时 -
www3837:
org.slf4j.Logger 下载 -
hyztty:
wait_timeout = 86400 interacti ...
druid连接池 -
niaodanwangzi:
连接池可不是给你检测连接状态用的。是为了连接复用,减少连接数。 ...
druid连接池 -
supermine0903:
学习了 啦啦啦
多个路由器同时上网
join,说白了就是让本来异步执行的多线程变成同步执行的。
这么说比较抽象,不太好理解,我们举个例子如下:
package mythread; public class JoinThread extends Thread { public static int n = 0; static synchronized void inc() { n++; System.out.println("当前活动线程和N分别为:"+Thread.currentThread().getName()+"_"+n); } public void run() { for (int i = 0; i < 10; i++) try { inc(); sleep(3); // 为了使运行结果更随机,延迟3毫秒 } catch (Exception e) { } } public static void main(String[] args) throws Exception { Thread threads[] = new Thread[100]; for (int i = 0; i < threads.length; i++) // 建立100个线程 threads[i] = new JoinThread(); for (int i = 0; i < threads.length; i++){// 运行刚才建立的100个线程 threads[i].start(); System.out.println("线程"+i+"start了"); threads[i].join();//关键点 } System.out.println("n=" + JoinThread.n); } }
这段代码,放在eclipse中运行一下,看看就会发现其中的端倪了。
在代码中,我作了个标记“关键点”。
大家可以分别将这句话注释和打开时,发现n输入的值是不一样的。
如果不用join(),那么n打出来每次都不一样,有可能是300,有可能是180,反正不可能是1000。
而加入Join后必然是1000。
那么这是为什么呢?
原来大家要知道线程与线程是竞争的关系,当main函数创建了一个第一个线程后,它就开始和main所在的线程进行竞争(即抢占对CPU的控制权)。谁也不服输。
如果线程1竞争成功,那么他就是去将n++,他想去循环10遍,可是main不会让它这么轻松,通过观察此程序运行结果就可以看出,线程1的10次是被分散了很多次才完成的,毕竟当线程创建越多,线程1的竞争能力就越差。
如果是main竞争成功,那么他就会去创建线程2,线程2创建成功后,又同时与线程1和main竞争。
这样当main创建完第100个线程后,此时100个线程正在打架,谁了不服谁。每个线程的10次都没有全部完成。
此时,如果我们强行打印出N的值,肯定是远远小于1000的。
而如果我们刚创建完一个线程就让它Join后,那么就相当于有警察在旁边执勤了。
main线程不准抢线程1的CPU控制权,等线程1运行结束后,再让main创建线程2。
这样就有条不紊了。
评论
5 楼
zhangjq5
2012-09-04
寻墨小楼 写道
zhangjq5 写道
wzt7576 写道
线程1的10次是被分散了很多次才完成的,
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
哥们,那时候人家的线程是在没加入join方法的前提下执行的!!!
兄弟看看我3楼的疑问啊。
哥们,你的顺序弄错了:
thread1.start(); thread2.start(); thread1.join(); thread2.join();
应该改成:
thread1.start(); thread1.join(); thread2.start(); thread2.join();
其实这里有三个线程,一个是主线程(这里称main),main是开始就存在的,它负责主流程代码的执行,首先创建了线程1和线程2,当线程1和线程2启动以后,程序中就有了三个线程。并且这3个线程同时进行各自的任务。你之前那个顺序是两个线程已经执行完了,然后才去join的,所以没有效果。
4 楼
寻墨小楼
2012-08-29
zhangjq5 写道
wzt7576 写道
线程1的10次是被分散了很多次才完成的,
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
哥们,那时候人家的线程是在没加入join方法的前提下执行的!!!
兄弟看看我3楼的疑问啊。
3 楼
寻墨小楼
2012-08-29
我也有这个简单的疑问。
譬如这个简单的join测试用例。
是thread1先join到主线程 然后thread2才开始join进去。
但结果是thread1, thread2两个交替进行的。
按我的理解,先执行完thread1, 然后再执行thread2,最后主线程。
但现在是thread1, thread2交替执行,然后是主线程。
求解?
譬如这个简单的join测试用例。
public class EvenOdd extends Thread{ private int i0, delay; public EvenOdd(int first, int interval){ i0 = first; delay = interval; } public void run(){ try{ for(int i=i0; i<= 100; i+=2){ System.out.println(i); sleep(delay); } } catch(InterruptedException e){ return; } } } public class ThreadTest { /** * @param args */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub EvenOdd thread1 = new EvenOdd(1, 20); EvenOdd thread2 = new EvenOdd(0, 30); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println("Main thread done"); } }
是thread1先join到主线程 然后thread2才开始join进去。
但结果是thread1, thread2两个交替进行的。
按我的理解,先执行完thread1, 然后再执行thread2,最后主线程。
但现在是thread1, thread2交替执行,然后是主线程。
求解?
2 楼
zhangjq5
2012-08-29
wzt7576 写道
线程1的10次是被分散了很多次才完成的,
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
哥们,那时候人家的线程是在没加入join方法的前提下执行的!!!
1 楼
wzt7576
2012-06-04
线程1的10次是被分散了很多次才完成的,
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
你说的这种情况不可能出现吧,当第一个新线程启动后,join后(加入了主线程),主线程必须等他执行完才能执行for循环的下一轮循环(开启第二个新线程)啊
发表评论
-
普通类和线程类的区别
2017-02-18 21:44 1248假设一个类是SubThread,它的init( ... -
最近一些心得
2017-02-08 16:01 8951、Mac starUML在导出png图片时,不要用s ... -
druid连接池
2016-09-14 16:00 5197环境:Ubuntu+Mysql5.5 近期一直报 ... -
罕见问题记录
2016-08-24 17:56 9201、如果提示对catalina.out无权限。 此时 ... -
Java Security
2016-08-24 17:50 959背景: 公司有某些场景需要向第三方提供服务, ... -
kafka java demo
2016-07-10 20:51 6765环境:ubuntu10 2台(32位)+JDK1.8(32 ... -
autowired resource component
2016-05-11 15:23 947背景:同样的bean类型有2个。 尝试用autowire ... -
eclipse 部署spring源码经验之谈
2016-05-08 23:41 17071、junit加载applicationCont ... -
eclipse离线安装插件
2016-05-08 20:41 12691、直接将下载的压缩包解压,然后将feature和pl ... -
eclipse mars gradle plugin
2016-05-04 19:12 1000环境:Mac os10.11.3+Mars4.5.2 ... -
main函数中如何实例化内部类
2016-04-30 22:50 1205需要先new一个父类的对象,然后用父类对象.new 内 ... -
java synchronized 串行
2016-04-30 22:42 1196背景:大家都知道用synchronized来实现加锁 ... -
观察者 Listener是什么意思
2016-02-26 10:40 946从观察者设计模式来看,Listener翻译成中文就是 ... -
UTF-8和Unicode的关系
2016-02-25 16:34 981utf-8只实际了unicode的第一个plane ... -
dubbo
2016-02-18 15:48 7731、配置dubbo.xml,主要是连接到dubbo服务 ... -
datetime格式化
2016-02-18 11:25 841org.joda.DateTime格式化成特定的Str ... -
Java接口中的成员变量为什么必须是public static final?
2016-01-10 16:20 1380必须是final的,否则多个类全继承他后,每个人都改, ... -
抽象类能不能有构造函数
2016-01-10 16:06 1041可以有,但是不能用,即不能new。 refur ... -
workspace workset设置
2016-01-10 15:51 1235背景:当eclipse里面的项目太多时,看上去非常凌 ... -
eclipse一直building workspace
2015-12-10 19:37 811我这里的原因很特殊,是因为在配置spring d ...
相关推荐
Python_threading_3_join功能_(多线程_教学教程tutorial)
3. 资源消耗测试:分析多线程运行时内存、CPU和其他资源的使用情况。 4. 并发测试:评估程序在高并发场景下的稳定性和响应能力。 5. 错误处理和异常测试:确保在多线程环境下程序能够正确捕获和处理异常。 总之,多...
在PB9中,虽然官方并未直接支持多线程,但开发者可以通过使用Windows API函数来实现。一种常见的方式是创建一个新的窗口类,该窗口类在不同的线程上运行。通过调用如CreateThread或BeginThread等API函数,可以在新的...
在计算机编程中,多线程是一种并发执行任务的技术,它允许多个子任务在同一时间运行,从而提高了程序的效率和响应性。这个“多线程例子”演示了如何在C++环境中实现多线程功能。下面我们将深入探讨多线程的基本概念...
在 Linux 下,多线程编程使用的是 POSIX 规范,提供了很多有用的函数和变量来控制线程的创建、执行和同步。 pthread 库是 Linux 下多线程编程的核心库,提供了丰富的函数和变量来控制线程的创建、执行和同步。 在本...
在PowerBuilder(PB)开发环境中,多线程技术是一种关键特性,它允许应用程序同时执行多个独立的任务,提高程序...在实际应用中,开发者应根据需求设计复杂的多线程逻辑,合理使用同步机制,以确保程序的稳定性和性能。
在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的多线程支持。本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多...
在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。以下是对“C++多线程编程的十个例子”的详细讲解,这些例子将帮助你在Windows环境下深入理解和应用多线程。 1. **...
多线程编程需考虑性能优化,包括减少上下文切换、合理分配工作负载、使用合适的同步机制等。调试多线程程序通常较复杂,gdb等调试器提供了线程查看和控制功能,帮助开发者定位问题。 总结,Linux系统的多线程编程为...
本资源包含六个完整的多线程实例,涵盖了从基础使用到高级特性的全面实践,例如线程的创建、同步与互斥。 1. **线程的创建**:在C#.NET中,可以使用`System.Threading.Thread`类来创建新的线程。实例可能演示了如何...
3.使用线程池:可以使用线程池来实现多线程编程,以提高程序的执行效率和响应速度。 多线程编程是一个非常重要的概念,它可以提高程序的执行效率和响应速度。但是,多线程编程也有一些缺点和挑战,需要程序员小心地...
这个压缩包包含六个C#.NET多线程的实例,涵盖了多线程的基本使用以及互斥等高级特性。以下是这些实例可能涉及的知识点详解: 1. **线程创建与启动** - `System.Threading.Thread` 类是.NET中创建新线程的基础,...
这个库是用C++编写的动态链接库(DLL),它的目标是为AutoIt3提供多线程能力。DLL是一种可插入到其他程序中的代码模块,可以增强或扩展程序的功能。在这个特定案例中,DLL使得AutoIt3脚本能够创建并管理多个线程,...
同时,也应考虑线程间的通信开销以及上下文切换的成本,以确保多线程的使用确实带来了性能提升。 在实际应用中,理解并熟练运用这些知识点,可以有效地编写出高效的多线程排序程序,充分利用现代计算机的多核处理...
2. **线程同步与互斥**:为避免多线程间的竞态条件,需要使用同步机制。C++提供了`std::mutex`来实现互斥锁,保证同一时间只有一个线程访问共享资源。`std::lock_guard`是RAII(Resource Acquisition Is ...
Java作为一门广泛使用的高级编程语言,其内置的多线程机制为开发者提供了丰富的工具,以便在多核架构上进行高效编程。在递归算法中,利用Java的多线程特性可以显著提升算法的执行效率,尤其是在处理大规模数据集时。...
本文档主要涉及Linux多线程编程的一些关键知识点,包括pthread线程库的使用、线程的创建、线程的退出以及线程的同步等。 首先,我们来探讨pthread线程库。pthread,全称POSIX threads,是遵循POSIX线程标准的一套...
本示例"C++在多线程中使用mciSendString播放音乐demoB"着重于如何在多线程环境下利用Windows Multimedia Control Interface (MCI) 函数mciSendString来实现音乐播放。下面我们将深入探讨这两个关键概念。 首先,多...
LinuxThreads 库提供了一些多线程编程的关键函数,如 pthread_create() 函数、pthread_exit() 函数、pthread_join() 函数等。这些函数可以帮助开发人员轻松地编写多线程程序。 多线程编程是一种高效的程序设计方法...
本主题聚焦于如何使用Python的Selenium与Chrome浏览器进行多开和多线程操作,结合phantomjs和chromedriver这两个关键组件来实现。首先,让我们详细了解一下这些概念。 1. **Selenium**: Selenium是一个强大的Web...