关于java多线程一些心得 - Java综合 - Java - ITeye论坛(转载)

来源:互联网 发布:php transaction 编辑:程序博客网 时间:2024/05/01 10:22

1、主线程死掉之后 ,所有在主线程上启动的线程并不会死掉
2、通过把线程加入ThreadGroup可以操作其他同组线程的生命
3、如果想在子线程中杀掉主线程,直接把主线程的Thread的传入子线程即可
4、要想关闭多线程程序,需要把当前所有的线程全部杀死才能关闭
5、各个线程互补影响~父子线程也不会有影响

 
 
千言万语汇总就那么几句话

When a Java Virtual Machine starts up, there is usually a single non-daemon thread (which typically calls the method named main of some designated class). The Java Virtual Machine continues to execute threads until either of the following occurs:

    * The exit method of class Runtime has been called and the security manager has permitted the exit operation to take place.
    * All threads that are not daemon threads have died, either by returning from the call to the run method or by throwing an exception that propagates beyond the run method.
lirong1978
线程到底有啥用啊,不就是同时执行多个任务么,不就是CPU分配时间片一会儿执行这个,一会儿执行那个,跟先把这个执行完,再执行那个有什么区别啊,谁能说下呢
 
 
呵呵 有些程序是需要同时处理多个通道的....
c++一般采用多进程的方式~~直接fork
java的fork的话 会启动多个虚拟机进行执行~~所有采用多线程
多成成好像CPU利用率上面更好一些~~具体的就忘掉了
 
lirong1978 写道
线程到底有啥用啊,不就是同时执行多个任务么,不就是CPU分配时间片一会儿执行这个,一会儿执行那个,跟先把这个执行完,再执行那个有什么区别啊,谁能说下呢

因为并不是所有的线程都能很好的利用CPU,有可能有些操作会阻塞,如果顺序执行的话,那那个阻塞的方法岂不是拦着别的方法的执行,如果多线程的话,那个阻塞的方法只塞他自己的线程,别的线程照样跑。
经典的运用就是ServerSocket.accept(),一个线程一直等别人连接,另外可以起一些线程去处理连接到的socket,如果不用多线程,怎么处理的了?除非转换观念用NIO。
 
lirong1978 写道
线程到底有啥用啊,不就是同时执行多个任务么,不就是CPU分配时间片一会儿执行这个,一会儿执行那个,跟先把这个执行完,再执行那个有什么区别啊,谁能说下呢

你说的是并发,利用的单CPU轮询。现代意义的多线程是并行的,利用多CPU处理器,同时工作。
 
dyllove98 写道
呵呵 有些程序是需要同时处理多个通道的....
c++一般采用多进程的方式~~直接fork
java的fork的话 会启动多个虚拟机进行执行~~所有采用多线程
多成成好像CPU利用率上面更好一些~~具体的就忘掉了


JDK1.2 之前采用所谓的Green Thread,不完全依赖于OS的线程调度。

后面的版本就不同了,直接利用OS或者是CPU线程调度,值得一提的是,Java线程和OS线程的映射比率是M:N(可能一对一,当M=N时)。

借宝地问下。
setDeamon(boolean)
这个方法的具体作用是什么? 与no-Deamon有什么区别或者权限么?

至于为什么要多线程?

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

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

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

setDeamon(boolean)用来设置线程为守护线程。
如果一个线程是守护线程,那么它创建的线程默认也是守护线程。
 
**不过我觉得你还是没有回答我的问题。
自己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的时候还真没注意,实验如下:

Java代码 复制代码 收藏代码
  1. public class DaemonThread extends Thread{   
  2.   
  3.     public void  run(){   

  1.         while(true){   
  2.         System.out.println("I'm daemon");   
  3.         }   
  4.     }   
  5.     public static void main(String args[]){   
  6.         DaemonThread daemon=new DaemonThread();   
  7.         daemon.setDaemon(true);   
  8.         daemon.start();   
  9.     }   
  10. }  


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

**关于JVM的进程间通讯,没深入了解过,不妨说说?

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

 
 
小弟不才,线程间通讯这个话题,我了解也不是很多,个人觉得去baidu上搜一下经典的讲解才是王道。

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

欢迎指正
 
zhaspe 写道

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

欢迎指正


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

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

如果都从自己内存中读取的话,就不需要同步了,呵呵