社区问答第20期:拿下Java多线程高地 !!

-空白式 2015-08-05 10:07:23
加精
Java多线程无处不在,如服务器、数据库、应用。多线程可以有效提升计算和处理效率,大大提升吞吐量和可伸缩性,深得广大程序员和公司的青睐。很多人学习完JavaSE/JavaEE之后想往更深入的技术进行探索,比如对大数据、分布式、高并发类的专题进行攻克时,立即遇到针对java.lang包中线程类的学习,但线程类的学习并不像JDBC一样简单,学习曲线陡峭,多弯路与“坑”。要学习这些热点技术,Java多线程技术避无可避。

本期的社区问答(8月5日——8月13日)我们请来了《Java多线程编程核心技术》一书的作者、资深Java专家高洪岩(id: javaThreadGo),为大家解答关于java及Java多线程技术等相关问题,引领大家拿下该“技术高地”。

嘉宾简介

高洪岩,某世界500强企业高级项目经理,10余年项目管理与开发经验,10年Java相关开发经验,深谙Java技术开发难点与要点,拥有良好的技术素养和丰富的实践经验。精通J2EE核心技术、基于EJB的分布式系统开发、Android移动开发、智能报表、多线程及高并发等相关的技术内容,近期继续关注并发相关的前沿技术。喜欢将技术与教育相结合的方式共享知识,得以共同提高。生活中喜欢摄影, 对轮滑,旅游,航模亦兴趣浓厚。

问答结束后,高洪岩老师会从所有参与活动并提出问题的朋友中选出三位,送上新作《Java多线程编程核心技术》一书



图书购买 京东

为了营造更好的问答氛围,我们不欢迎一切与主题无关的讨论、灌水和无脑喷子。

下面欢迎大家踊跃提问,在本帖回复即可。

--------------------------------------------------------------------------------------------------------

本期问答获奖用户:

Fanshujuntuan
Infoworld
jsdf2008

请获奖用户将本人 邮寄地址+姓名+联系电话 发私信至楼主,我们会尽快为您邮寄礼品。
...全文
14460 75 打赏 收藏 转发到动态 举报
写回复
用AI写文章
75 条回复
切换为时间正序
请发表友善的回复…
发表回复
夏威夷鹏雕 2015-08-17
  • 打赏
  • 举报
回复
多线程相关的技术在实际项目中用的确实比较少,希望lz提供一些项目中的应用场景,更有利于我们理解。
Xiao白_CC 2015-08-14
  • 打赏
  • 举报
回复
我已经看完了,,求老高送书!
sinat_30578789 2015-08-13
  • 打赏
  • 举报
回复
哦 已阅 辛苦了
绝地反击T 2015-08-13
  • 打赏
  • 举报
回复
在Hadoop中的NameNode节点和DataNode节点之间,他们之间的通信是怎么实现的,一个JobTracker管理多个TaskTracker吃得消吗?即使用了高并发和多线程?
Evankaka 2015-08-12
  • 打赏
  • 举报
回复
我这里倒是有些问题, 1、远程控制中,即要传输对方的桌面的图片,又要传输对方的鼠标,如果可能的话。还要传输文件 。这个要怎么来设计。 2、如果是远程控制中,如何通过多线程来实现多台电脑控制一台电脑。被控端要怎么来设计线程给不同的电脑发送数据,能让多台电脑的体验都一样? 3、12306网站它们是使用什么的原理来实现高并发的?
o_n_omika 2015-08-12
  • 打赏
  • 举报
回复
只知道一些基本的知识,求一个实用的demo
Image_life 2015-08-12
  • 打赏
  • 举报
回复
只因用的太少,所以多线程比较神秘了。
dalong_zh 2015-08-12
  • 打赏
  • 举报
回复
半个月前买的这本书,讲解api,读了这本书对api有了了解,但是在web项目中,如何对取得数据库信息加锁,并且高效,不是很了解
javaThreadGo 2015-08-12
  • 打赏
  • 举报
回复
引用 69 楼 u010794180 的回复:
android中多点下载应该就是吧
是的,包括效率比较高的多线程断点续传都是的
引用 70 楼 jsdf2008 的回复:
[quote=引用 68 楼 javaThreadGo 的回复:] [quote=引用 55 楼 infoworld 的回复:] 外部对ConcurrentHashMap加锁的话那不是和Hashtable一样了么, 效率也不会高啊, 而且put也自带一层锁,那Concurent就没意义了吧,能举个例子使用外部加锁的例子吗?ConcurrentHashMap
可以使用同步代码块,在需要同步的地方进行包围,即保证了效率,又保证了安全
引用 57 楼 u013769320 的回复:
请问,如何安全的发布共享变量?有哪些方式呢?以及什么情况下会涉及到线程安全?
发布共享变量可以使用ThreadLocal,volatile,同步synchronized,根据不同的情况使用不同的处理方式。只要涉及多个线程访问同一个对象的实例变量时就要考虑线程是否安全了。
引用 58 楼 u011221339 的回复:
深入的都还不太了解,感觉Java用的人是多,但是深入的技术方面的书籍或者分享太少了,无从深入就导致了Java的中高级工程师很少
其实这样的情况是JVM的native隐藏过多造成的,JVM的不开源,造成很多知识仅仅要靠经验来解决,虽然HotSpot VM提供了源代码,但基本是从JAVA语言跳到了C,这对JAVA程序员的学习增加了时间成本,得不尝失。所以我想与其这样,不如转而研究JVM优化来得更实在一些:)
引用 60 楼 jsdf2008 的回复:
你好 请教一下 比如我解析一个500M的文件 我想把这个文件先分成10份 然后启10个线程进行解析 那么问题来了 如果一个500M的文件 我先不分割 那么怎么用10个线程对这一个文件进行解析啊 要保证这个文件里的所有数据都被解析了 而且文件里的每行数据解析没有重复啊 还有个问题 如果只启动一个线程解析的效率和启动10个线程启动的效率哪个高啊 谢谢大牛
分割的情况:多个线程负责某一部分,比如A线程负责处理1-10000行,线程B负责处理10001-20000行,等等。如果分割的算法没有错误,则全部的数据都可以被处理 不分割的情况:针对您的这种情况,建议还是使用单线程进行处理,因为仅仅是处理数据,而无阻塞的情况,单线程的运行效率是最快的,不需要CPU上下文切换
引用 61 楼 jsdf2008 的回复:
package com.test;

public class MyThread  implements Runnable {
	 private int ticket = 1000;  //5张票 
	  
	 @Override
	    public void run() { 
	        for (int i=0; i<=10000 ;i++) { 
	            if (this.ticket > 0) { 
	                System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket--); 
	            } 
	        } 
	    } 

}


package com.test;

public class ThreadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		MyThread my = new MyThread();
		new Thread(my, "1号窗口").start();
		new Thread(my, "2号窗口").start();
		new Thread(my, "3号窗口").start();
		for (int i = 0; i <= 1000; i++) {
			System.out.println(Thread.currentThread().getName() + "::" + i);
		}

	}
}
这是一个简单的多线程的程序 我一直想不明白的一点就是 比如我执行了Main方法 假如主线程Main方法里的for循环循环到i=20了 这个时候cpu被其他线程抢去了 过了一会儿Main线程又抢到了CPU执行权 为啥main线程这时候直接从for循环的i=20执行了 为啥这时候主线程main 不从头开始执行Main函数啊 JAVA多线程机制是通过什么知道main线程上次执行到i=20的 然后这次抢到线程直接从i=20这里执行的 其他自定义的线程也是 比如1号窗口线程 假如上次线程执行到卖票i=10 为啥下次1号窗口线程抢到cpu执行权 程序直接知道从自定义线程的i=10往后执行 线程怎么知道自己执行cpu之前运行到哪里了 这个自定义的线程为啥不从main函数丛头开始在执行一次啊 这个我只知道结果 不知道原因 为啥线程能知道上次运行到哪里了 而不是从头开始在执行一遍啊 请大牛指点一下啊
这个问题典型的就是操作系统课程中的“中断”啊,分为硬中断-CPU和软中断-软件,主要的原理就是使用CPU指令 ,给您一个网址: http://blog.csdn.net/wangzhen199009/article/details/38677075 可以看一下
引用 62 楼 whzxcvbnm 的回复:
数据库中也有“锁”的概念,它跟java多线程中的“锁”是类似的概念吗?还是有什么区别?
我认为,这两种锁从使用目的性上来看是一样,只不过一个保证类中的属性值是安全的,另外一个是保证数据表的行的内容是安全的
引用 63 楼 lxz521lxz 的回复:
岩哥,你好! 我们都知道ThreadLocal适用于同一个线程的本地变量副本,但是子线程与主线程之间如何做到变量共享同时又不受其他线程干扰呢?
Thread.java源代码如下:
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

    /*
     * InheritableThreadLocal values pertaining to this thread. This map is
     * maintained by the InheritableThreadLocal class.
     */
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
也就是每一个Thread都有自己的ThreadLocalMap对象,当然就不受其它线程干扰了。
引用 66 楼 u014237786 的回复:
想深入的学习java,很迷茫不知从哪下手,现在工作也不忙,特别想充电。lz,这书网上可以买吧?
要学习java该学的东西太多了,建议与工作相关的技术进行入手,然后深入挖掘,一来加重了知识的深入,二来也对工作有益。本书网上有售,感谢关注。[/quote] 我是转行做的JAVA所以不知道有操作系统的中断这一概念因为没学过计算机基础课程啊 灰常谢谢指点啊 在请问教下多线程设计yied这个方法我感觉很不好 它的字面意思是线程礼让 就是把CPU的执行权让出去 但是把CPU让出去的话 它自己也参与去抢 所以它自己还是能抢到CPU的执行权啊 还有个就是 thread.setPriority设置线程的等级的这个方法 这个设置线程的等级 但是线程等级高的也不是肯定就比线程等级低的先抢到CPU执行权 只是概率大 所以我感觉这两个方法设计的都不好啊[/quote] 呵,越快的确越好,但完全占用CPU的资源也是不可取的,所以yield方法就可以与其它任务分享CPU资源 。优先级是增大概率,不100%最优先的,公平,尽量的公平。
引用 72 楼 wojiaolibo 的回复:
高老师,想请教一个问题,在现有的服务器中,经常会有应用挂掉,因为内存泄漏,GC回收比较慢,有什么好的办法解决这个问题吗?已经尝试过增大内存了,代码是第三方开发的,总找他们解决,但是没有根本解决这个问题啊.总是调整这些参数,增大线程池初始化数量,增大内存,感觉并没有什么好的效果.
这种情况一定要使用JVM内存快照工具来分析,应该有内存溢出的代码。
引用 76 楼 jsdf2008 的回复:
[quote=引用 68 楼 javaThreadGo 的回复:] [quote=引用 55 楼 infoworld 的回复:] 外部对ConcurrentHashMap加锁的话那不是和Hashtable一样了么, 效率也不会高啊, 而且put也自带一层锁,那Concurent就没意义了吧,能举个例子使用外部加锁的例子吗?ConcurrentHashMap
可以使用同步代码块,在需要同步的地方进行包围,即保证了效率,又保证了安全
引用 57 楼 u013769320 的回复:
请问,如何安全的发布共享变量?有哪些方式呢?以及什么情况下会涉及到线程安全?
发布共享变量可以使用ThreadLocal,volatile,同步synchronized,根据不同的情况使用不同的处理方式。只要涉及多个线程访问同一个对象的实例变量时就要考虑线程是否安全了。
引用 58 楼 u011221339 的回复:
深入的都还不太了解,感觉Java用的人是多,但是深入的技术方面的书籍或者分享太少了,无从深入就导致了Java的中高级工程师很少
其实这样的情况是JVM的native隐藏过多造成的,JVM的不开源,造成很多知识仅仅要靠经验来解决,虽然HotSpot VM提供了源代码,但基本是从JAVA语言跳到了C,这对JAVA程序员的学习增加了时间成本,得不尝失。所以我想与其这样,不如转而研究JVM优化来得更实在一些:)
引用 60 楼 jsdf2008 的回复:
你好 请教一下 比如我解析一个500M的文件 我想把这个文件先分成10份 然后启10个线程进行解析 那么问题来了 如果一个500M的文件 我先不分割 那么怎么用10个线程对这一个文件进行解析啊 要保证这个文件里的所有数据都被解析了 而且文件里的每行数据解析没有重复啊 还有个问题 如果只启动一个线程解析的效率和启动10个线程启动的效率哪个高啊 谢谢大牛
分割的情况:多个线程负责某一部分,比如A线程负责处理1-10000行,线程B负责处理10001-20000行,等等。如果分割的算法没有错误,则全部的数据都可以被处理 不分割的情况:针对您的这种情况,建议还是使用单线程进行处理,因为仅仅是处理数据,而无阻塞的情况,单线程的运行效率是最快的,不需要CPU上下文切换
引用 61 楼 jsdf2008 的回复:
package com.test;

public class MyThread  implements Runnable {
	 private int ticket = 1000;  //5张票 
	  
	 @Override
	    public void run() { 
	        for (int i=0; i<=10000 ;i++) { 
	            if (this.ticket > 0) { 
	                System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket--); 
	            } 
	        } 
	    } 

}


package com.test;

public class ThreadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		MyThread my = new MyThread();
		new Thread(my, "1号窗口").start();
		new Thread(my, "2号窗口").start();
		new Thread(my, "3号窗口").start();
		for (int i = 0; i <= 1000; i++) {
			System.out.println(Thread.currentThread().getName() + "::" + i);
		}

	}
}
这是一个简单的多线程的程序 我一直想不明白的一点就是 比如我执行了Main方法 假如主线程Main方法里的for循环循环到i=20了 这个时候cpu被其他线程抢去了 过了一会儿Main线程又抢到了CPU执行权 为啥main线程这时候直接从for循环的i=20执行了 为啥这时候主线程main 不从头开始执行Main函数啊 JAVA多线程机制是通过什么知道main线程上次执行到i=20的 然后这次抢到线程直接从i=20这里执行的 其他自定义的线程也是 比如1号窗口线程 假如上次线程执行到卖票i=10 为啥下次1号窗口线程抢到cpu执行权 程序直接知道从自定义线程的i=10往后执行 线程怎么知道自己执行cpu之前运行到哪里了 这个自定义的线程为啥不从main函数丛头开始在执行一次啊 这个我只知道结果 不知道原因 为啥线程能知道上次运行到哪里了 而不是从头开始在执行一遍啊 请大牛指点一下啊
这个问题典型的就是操作系统课程中的“中断”啊,分为硬中断-CPU和软中断-软件,主要的原理就是使用CPU指令 ,给您一个网址: http://blog.csdn.net/wangzhen199009/article/details/38677075 可以看一下
引用 62 楼 whzxcvbnm 的回复:
数据库中也有“锁”的概念,它跟java多线程中的“锁”是类似的概念吗?还是有什么区别?
我认为,这两种锁从使用目的性上来看是一样,只不过一个保证类中的属性值是安全的,另外一个是保证数据表的行的内容是安全的
引用 63 楼 lxz521lxz 的回复:
岩哥,你好! 我们都知道ThreadLocal适用于同一个线程的本地变量副本,但是子线程与主线程之间如何做到变量共享同时又不受其他线程干扰呢?
Thread.java源代码如下:
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

    /*
     * InheritableThreadLocal values pertaining to this thread. This map is
     * maintained by the InheritableThreadLocal class.
     */
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
也就是每一个Thread都有自己的ThreadLocalMap对象,当然就不受其它线程干扰了。
引用 66 楼 u014237786 的回复:
想深入的学习java,很迷茫不知从哪下手,现在工作也不忙,特别想充电。lz,这书网上可以买吧?
要学习java该学的东西太多了,建议与工作相关的技术进行入手,然后深入挖掘,一来加重了知识的深入,二来也对工作有益。本书网上有售,感谢关注。[/quote]对了 你是JAVAEE核心框架实战的作者吗 我感觉这本书对我转换搞JAVA的特别浅显易懂 特别是各种框架转JSON 讲的很详细 很实用 希望你能出一本讲JS 和jquery方面的书 [/quote] 呵呵,感谢您购买我的另外一本拙作,并且认可我的这种写作。大家进入javaweb的学习会遇到很多的框架,其实每一种框架都有常用的那么几个技术需要必须要掌握的,我想我应该把这类技术总结出来,并且用最浅显易懂的方式让读者以最快的时间进行跨语言或转行业的学习,我不希望我的读者买到的是一本100个案例,却在公司中只用到20个的书籍,那样我认为是浪费读者的金钱与学习的成本,那就是时间,读者只要入了门,其它80个案例如果在公司中遇到那么几个只要在网上找找资源都会解决的,所以我写作的目标就是快速,便携的学习。包括这本JAVA多线程的书,里面共有180多个JAVA案例,用无“多余”的代码展示每一个技术点,目的就是让读者快速学习,快速掌握。 说的有点多,呵呵,感谢你们的支持。我会继续努力。
引用 77 楼 dalong_zh 的回复:
半个月前买的这本书,讲解api,读了这本书对api有了了解,但是在web项目中,如何对取得数据库信息加锁,并且高效,不是很了解
继续看第二章吧:)
引用 78 楼 u011043985 的回复:
只因用的太少,所以多线程比较神秘了。
嗯,其实一点也不难
引用 80 楼 jeck5000 的回复:
送我书,好吗?
感谢支持:)
引用 82 楼 MarkGuo_ 的回复:
前10天左右买了书本,想好好的学习一下... 感觉在web项目中应用的很少...
共同努力 !
ggggkkkk- 2015-08-12
  • 打赏
  • 举报
回复
前10天左右买了书本,想好好的学习一下... 感觉在web项目中应用的很少...
MrLixinglin 2015-08-12
  • 打赏
  • 举报
回复
卖书的软文!
jeck5000 2015-08-12
  • 打赏
  • 举报
回复
送我书,好吗?
小小二子 2015-08-11
  • 打赏
  • 举报
回复
高老师,想请教一个问题,在现有的服务器中,经常会有应用挂掉,因为内存泄漏,GC回收比较慢,有什么好的办法解决这个问题吗?已经尝试过增大内存了,代码是第三方开发的,总找他们解决,但是没有根本解决这个问题啊.总是调整这些参数,增大线程池初始化数量,增大内存,感觉并没有什么好的效果.
小小二子 2015-08-11
  • 打赏
  • 举报
回复
引用 50 楼 javaThreadGo 的回复:
大家好啊,呵呵!
高老师好啊。
jsdf2008 2015-08-11
  • 打赏
  • 举报
回复
引用 68 楼 javaThreadGo 的回复:
[quote=引用 55 楼 infoworld 的回复:] 外部对ConcurrentHashMap加锁的话那不是和Hashtable一样了么, 效率也不会高啊, 而且put也自带一层锁,那Concurent就没意义了吧,能举个例子使用外部加锁的例子吗?ConcurrentHashMap
可以使用同步代码块,在需要同步的地方进行包围,即保证了效率,又保证了安全
引用 57 楼 u013769320 的回复:
请问,如何安全的发布共享变量?有哪些方式呢?以及什么情况下会涉及到线程安全?
发布共享变量可以使用ThreadLocal,volatile,同步synchronized,根据不同的情况使用不同的处理方式。只要涉及多个线程访问同一个对象的实例变量时就要考虑线程是否安全了。
引用 58 楼 u011221339 的回复:
深入的都还不太了解,感觉Java用的人是多,但是深入的技术方面的书籍或者分享太少了,无从深入就导致了Java的中高级工程师很少
其实这样的情况是JVM的native隐藏过多造成的,JVM的不开源,造成很多知识仅仅要靠经验来解决,虽然HotSpot VM提供了源代码,但基本是从JAVA语言跳到了C,这对JAVA程序员的学习增加了时间成本,得不尝失。所以我想与其这样,不如转而研究JVM优化来得更实在一些:)
引用 60 楼 jsdf2008 的回复:
你好 请教一下 比如我解析一个500M的文件 我想把这个文件先分成10份 然后启10个线程进行解析 那么问题来了 如果一个500M的文件 我先不分割 那么怎么用10个线程对这一个文件进行解析啊 要保证这个文件里的所有数据都被解析了 而且文件里的每行数据解析没有重复啊 还有个问题 如果只启动一个线程解析的效率和启动10个线程启动的效率哪个高啊 谢谢大牛
分割的情况:多个线程负责某一部分,比如A线程负责处理1-10000行,线程B负责处理10001-20000行,等等。如果分割的算法没有错误,则全部的数据都可以被处理 不分割的情况:针对您的这种情况,建议还是使用单线程进行处理,因为仅仅是处理数据,而无阻塞的情况,单线程的运行效率是最快的,不需要CPU上下文切换
引用 61 楼 jsdf2008 的回复:
package com.test;

public class MyThread  implements Runnable {
	 private int ticket = 1000;  //5张票 
	  
	 @Override
	    public void run() { 
	        for (int i=0; i<=10000 ;i++) { 
	            if (this.ticket > 0) { 
	                System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket--); 
	            } 
	        } 
	    } 

}


package com.test;

public class ThreadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		MyThread my = new MyThread();
		new Thread(my, "1号窗口").start();
		new Thread(my, "2号窗口").start();
		new Thread(my, "3号窗口").start();
		for (int i = 0; i <= 1000; i++) {
			System.out.println(Thread.currentThread().getName() + "::" + i);
		}

	}
}
这是一个简单的多线程的程序 我一直想不明白的一点就是 比如我执行了Main方法 假如主线程Main方法里的for循环循环到i=20了 这个时候cpu被其他线程抢去了 过了一会儿Main线程又抢到了CPU执行权 为啥main线程这时候直接从for循环的i=20执行了 为啥这时候主线程main 不从头开始执行Main函数啊 JAVA多线程机制是通过什么知道main线程上次执行到i=20的 然后这次抢到线程直接从i=20这里执行的 其他自定义的线程也是 比如1号窗口线程 假如上次线程执行到卖票i=10 为啥下次1号窗口线程抢到cpu执行权 程序直接知道从自定义线程的i=10往后执行 线程怎么知道自己执行cpu之前运行到哪里了 这个自定义的线程为啥不从main函数丛头开始在执行一次啊 这个我只知道结果 不知道原因 为啥线程能知道上次运行到哪里了 而不是从头开始在执行一遍啊 请大牛指点一下啊
这个问题典型的就是操作系统课程中的“中断”啊,分为硬中断-CPU和软中断-软件,主要的原理就是使用CPU指令 ,给您一个网址: http://blog.csdn.net/wangzhen199009/article/details/38677075 可以看一下
引用 62 楼 whzxcvbnm 的回复:
数据库中也有“锁”的概念,它跟java多线程中的“锁”是类似的概念吗?还是有什么区别?
我认为,这两种锁从使用目的性上来看是一样,只不过一个保证类中的属性值是安全的,另外一个是保证数据表的行的内容是安全的
引用 63 楼 lxz521lxz 的回复:
岩哥,你好! 我们都知道ThreadLocal适用于同一个线程的本地变量副本,但是子线程与主线程之间如何做到变量共享同时又不受其他线程干扰呢?
Thread.java源代码如下:
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

    /*
     * InheritableThreadLocal values pertaining to this thread. This map is
     * maintained by the InheritableThreadLocal class.
     */
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
也就是每一个Thread都有自己的ThreadLocalMap对象,当然就不受其它线程干扰了。
引用 66 楼 u014237786 的回复:
想深入的学习java,很迷茫不知从哪下手,现在工作也不忙,特别想充电。lz,这书网上可以买吧?
要学习java该学的东西太多了,建议与工作相关的技术进行入手,然后深入挖掘,一来加重了知识的深入,二来也对工作有益。本书网上有售,感谢关注。[/quote]对了 你是JAVAEE核心框架实战的作者吗 我感觉这本书对我转换搞JAVA的特别浅显易懂 特别是各种框架转JSON 讲的很详细 很实用 希望你能出一本讲JS 和jquery方面的书
Deep_Learning 2015-08-11
  • 打赏
  • 举报
回复
请问一下:这种问题怎么处理: 1) java socket客户端检测到连接上没有接收到来自服务器端的数据包,并持续时间长度C后,为确认服务端连接正常,客户端主动启动心跳机制过程:客户端向服务端发送心跳检测请求HeartBeat,并期待服务端回复心跳检测应答HeartBeat_Ack; 2) 在客户端发送心跳检测请求HeartBeat后的时间长度T内没有接收到服务端心跳检测应答HeartBeat_Ack,客户端连续发起(N-1)次心跳检测请求HeartBeat; 3) 若均未收到服务端回复心跳检测应答HeartBeat_Ack,则客户端认为对方连接已中断,并释放本端连接资源。 4) 服务端则通过启动时间长度为C+T*N的定时器来确认客户端连接是否正常,如果在C+T*N时间内没有收到客户端发送的心跳检测请求HeartBeat或其他数据包,则认为对方连接已中断,释放本端连接资源;
乱世丶桃花 2015-08-11
  • 打赏
  • 举报
回复
我相信只要赠我一本《Java多线程编程核心技术》秘籍,我定能突破多年来的瓶颈,度过生死之劫,进入那个位面。。。。。。
hervyrain 2015-08-11
  • 打赏
  • 举报
回复
请问秒杀是怎么实现的,对多线程的应用没太多的理解
Heart09 2015-08-10
  • 打赏
  • 举报
回复
多线程虽好 不要滥用 更要注意锁的问题 默默支持一下!
jsdf2008 2015-08-10
  • 打赏
  • 举报
回复
引用 68 楼 javaThreadGo 的回复:
[quote=引用 55 楼 infoworld 的回复:] 外部对ConcurrentHashMap加锁的话那不是和Hashtable一样了么, 效率也不会高啊, 而且put也自带一层锁,那Concurent就没意义了吧,能举个例子使用外部加锁的例子吗?ConcurrentHashMap
可以使用同步代码块,在需要同步的地方进行包围,即保证了效率,又保证了安全
引用 57 楼 u013769320 的回复:
请问,如何安全的发布共享变量?有哪些方式呢?以及什么情况下会涉及到线程安全?
发布共享变量可以使用ThreadLocal,volatile,同步synchronized,根据不同的情况使用不同的处理方式。只要涉及多个线程访问同一个对象的实例变量时就要考虑线程是否安全了。
引用 58 楼 u011221339 的回复:
深入的都还不太了解,感觉Java用的人是多,但是深入的技术方面的书籍或者分享太少了,无从深入就导致了Java的中高级工程师很少
其实这样的情况是JVM的native隐藏过多造成的,JVM的不开源,造成很多知识仅仅要靠经验来解决,虽然HotSpot VM提供了源代码,但基本是从JAVA语言跳到了C,这对JAVA程序员的学习增加了时间成本,得不尝失。所以我想与其这样,不如转而研究JVM优化来得更实在一些:)
引用 60 楼 jsdf2008 的回复:
你好 请教一下 比如我解析一个500M的文件 我想把这个文件先分成10份 然后启10个线程进行解析 那么问题来了 如果一个500M的文件 我先不分割 那么怎么用10个线程对这一个文件进行解析啊 要保证这个文件里的所有数据都被解析了 而且文件里的每行数据解析没有重复啊 还有个问题 如果只启动一个线程解析的效率和启动10个线程启动的效率哪个高啊 谢谢大牛
分割的情况:多个线程负责某一部分,比如A线程负责处理1-10000行,线程B负责处理10001-20000行,等等。如果分割的算法没有错误,则全部的数据都可以被处理 不分割的情况:针对您的这种情况,建议还是使用单线程进行处理,因为仅仅是处理数据,而无阻塞的情况,单线程的运行效率是最快的,不需要CPU上下文切换
引用 61 楼 jsdf2008 的回复:
package com.test;

public class MyThread  implements Runnable {
	 private int ticket = 1000;  //5张票 
	  
	 @Override
	    public void run() { 
	        for (int i=0; i<=10000 ;i++) { 
	            if (this.ticket > 0) { 
	                System.out.println(Thread.currentThread().getName()+ "正在卖票"+this.ticket--); 
	            } 
	        } 
	    } 

}


package com.test;

public class ThreadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		MyThread my = new MyThread();
		new Thread(my, "1号窗口").start();
		new Thread(my, "2号窗口").start();
		new Thread(my, "3号窗口").start();
		for (int i = 0; i <= 1000; i++) {
			System.out.println(Thread.currentThread().getName() + "::" + i);
		}

	}
}
这是一个简单的多线程的程序 我一直想不明白的一点就是 比如我执行了Main方法 假如主线程Main方法里的for循环循环到i=20了 这个时候cpu被其他线程抢去了 过了一会儿Main线程又抢到了CPU执行权 为啥main线程这时候直接从for循环的i=20执行了 为啥这时候主线程main 不从头开始执行Main函数啊 JAVA多线程机制是通过什么知道main线程上次执行到i=20的 然后这次抢到线程直接从i=20这里执行的 其他自定义的线程也是 比如1号窗口线程 假如上次线程执行到卖票i=10 为啥下次1号窗口线程抢到cpu执行权 程序直接知道从自定义线程的i=10往后执行 线程怎么知道自己执行cpu之前运行到哪里了 这个自定义的线程为啥不从main函数丛头开始在执行一次啊 这个我只知道结果 不知道原因 为啥线程能知道上次运行到哪里了 而不是从头开始在执行一遍啊 请大牛指点一下啊
这个问题典型的就是操作系统课程中的“中断”啊,分为硬中断-CPU和软中断-软件,主要的原理就是使用CPU指令 ,给您一个网址: http://blog.csdn.net/wangzhen199009/article/details/38677075 可以看一下
引用 62 楼 whzxcvbnm 的回复:
数据库中也有“锁”的概念,它跟java多线程中的“锁”是类似的概念吗?还是有什么区别?
我认为,这两种锁从使用目的性上来看是一样,只不过一个保证类中的属性值是安全的,另外一个是保证数据表的行的内容是安全的
引用 63 楼 lxz521lxz 的回复:
岩哥,你好! 我们都知道ThreadLocal适用于同一个线程的本地变量副本,但是子线程与主线程之间如何做到变量共享同时又不受其他线程干扰呢?
Thread.java源代码如下:
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;

    /*
     * InheritableThreadLocal values pertaining to this thread. This map is
     * maintained by the InheritableThreadLocal class.
     */
    ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
也就是每一个Thread都有自己的ThreadLocalMap对象,当然就不受其它线程干扰了。
引用 66 楼 u014237786 的回复:
想深入的学习java,很迷茫不知从哪下手,现在工作也不忙,特别想充电。lz,这书网上可以买吧?
要学习java该学的东西太多了,建议与工作相关的技术进行入手,然后深入挖掘,一来加重了知识的深入,二来也对工作有益。本书网上有售,感谢关注。[/quote] 我是转行做的JAVA所以不知道有操作系统的中断这一概念因为没学过计算机基础课程啊 灰常谢谢指点啊 在请问教下多线程设计yied这个方法我感觉很不好 它的字面意思是线程礼让 就是把CPU的执行权让出去 但是把CPU让出去的话 它自己也参与去抢 所以它自己还是能抢到CPU的执行权啊 还有个就是 thread.setPriority设置线程的等级的这个方法 这个设置线程的等级 但是线程等级高的也不是肯定就比线程等级低的先抢到CPU执行权 只是概率大 所以我感觉这两个方法设计的都不好啊
加载更多回复(55)

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧