论坛首页 Java企业应用论坛

关于java多线程一些心得

浏览 14208 次
精华帖 (2) :: 良好帖 (1) :: 新手帖 (19) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-05-23   最后修改:2010-05-23
借宝地问下。
setDeamon(boolean)
这个方法的具体作用是什么? 与no-Deamon有什么区别或者权限么?

至于为什么要多线程?

我记得书本上的解释是:当年进程切换太耗资源,系统需要保存现场,还需要内存寻址等等,而多线程共用进程资源,在进程内寻址,在做切换时容易得多,所以就有了多进程和多线程之分。

我觉得c++也应该提倡多线程而非多进程,而跟语言没关系。

另外在多CPU环境下,多线程才真正算个“多线程”,呵呵
0 请登录后投票
   发表时间:2010-05-24  
C_J 写道
借宝地问下。
setDeamon(boolean)
这个方法的具体作用是什么? 与no-Deamon有什么区别或者权限么?

至于为什么要多线程?

我记得书本上的解释是:当年进程切换太耗资源,系统需要保存现场,还需要内存寻址等等,而多线程共用进程资源,在进程内寻址,在做切换时容易得多,所以就有了多进程和多线程之分。

我觉得c++也应该提倡多线程而非多进程,而跟语言没关系。

另外在多CPU环境下,多线程才真正算个“多线程”,呵呵

setDeamon(boolean)用来设置线程为守护线程。
如果一个线程是守护线程,那么它创建的线程默认也是守护线程。

至于Java多线程关于锁概念和进程间通讯,我觉得看了JVM的内存实现之后,大致就会明白了
0 请登录后投票
   发表时间:2010-05-26   最后修改:2010-05-27
zhaspe 写道
C_J 写道
借宝地问下。
setDeamon(boolean)
这个方法的具体作用是什么? 与no-Deamon有什么区别或者权限么?

至于为什么要多线程?

我记得书本上的解释是:当年进程切换太耗资源,系统需要保存现场,还需要内存寻址等等,而多线程共用进程资源,在进程内寻址,在做切换时容易得多,所以就有了多进程和多线程之分。

我觉得c++也应该提倡多线程而非多进程,而跟语言没关系。

另外在多CPU环境下,多线程才真正算个“多线程”,呵呵

setDaemon(boolean)用来设置线程为守护线程。
如果一个线程是守护线程,那么它创建的线程默认也是守护线程。

至于Java多线程关于锁概念和进程间通讯,我觉得看了JVM的内存实现之后,大致就会明白了


嗯,多谢你的关注。


**不过我觉得你还是没有回答我的问题。
自己google了下:
Any Java thread can be a daemon thread. Daemon threads are service providers for other threads running in the same process as the daemon thread. The run() method for a daemon thread is typically an infinite loop that waits for a service request.
When the only remaining threads in a process are daemon threads, the interpreter exits. This makes sense because when only daemon threads remain, there is no other thread for which a daemon thread can provide a service.
做过实验才明白,原来当只存在Daemon线程且没有用户线程的时候,JVM退出,以前写thread的时候还真没注意,实验如下:

public class DaemonThread extends Thread{

	public void  run(){
		while(true){
		System.out.println("I'm daemon");
		}
	}
	public static void main(String args[]){
		DaemonThread daemon=new DaemonThread();
		daemon.setDaemon(true);
		daemon.start();
	}
}

可以看到JVM很快就退出了,虽然这里是一个while(true)循环。

**关于JVM的进程间通讯,没深入了解过,不妨说说?
0 请登录后投票
   发表时间:2010-05-31  
小弟不才,线程间通讯这个话题,我了解也不是很多,个人觉得去baidu上搜一下经典的讲解才是王道。

不过我的一个简单理解是:Java的进程有自己的内存(比如有内存存放变量a),进程创建出来的各个线程也有自己的内存(如果线程用到变量a,那么线程有单独的内存存放变量a的一个copy)。
如果,线程同步变量a,那么线程第一次读取a的值的时候,就从进程内存中读取,否则从自己内存中读取。同理,如果线程同步变量a,每次写变量a的时候,不仅把值写入自己的内存中,也同时把值写入进程的内存中。

欢迎指正
0 请登录后投票
   发表时间:2010-05-31  
zhaspe 写道

如果,线程同步变量a,那么线程第一次读取a的值的时候,就从进程内存中读取,否则从自己内存中读取。同理,如果线程同步变量a,每次写变量a的时候,不仅把值写入自己的内存中,也同时把值写入进程的内存中。

欢迎指正


你的意思是说,如果对共享资源变量a不做线程同步,那么各自的线程从自己内存中读?

这个显然与多线程读取共享资源,发生读脏数据的情形是矛盾的呀。

如果都从自己内存中读取的话,就不需要同步了,呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics