Java线程的一些整理
2011-04-08 13:20
369 查看
这里是来自JavaAPI:
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
线程的一些特性:
所有的Java代码都是在某个线程中执行的,所以在任一行Java代码中使用Thread.currentThread()都可以得到当前运行线程。
JVM允许多个线程并发执行,虽然同一时刻只能有一个线程占用CPU,但每个线程占有的时间片非常短,所以人类的感官上多个线程是并发执行的。
当 JVM启动时,至少有一个用户线程运行,即执行某个类的main方法的线程。
线程在下列情况之一终止运行:
Thread.run方法运行完毕(或者是Thread包含的Runnable对象的run方法执行完毕)
run方法内的代码运行时发生异常。
JVM在下列情况下终止运行:
所有非守护线程(即用户线程,非daemon线程)终止。假如有main线程和另外一个用户线程在运行,即使main线程终止了,还必须等待另外一个线程终止JVM才会终止。
调用了Runtime类的exit方法(启动虚拟机的关闭序列)。
外部程序强行终止虚拟机执行(非正常退出)。
创建线程:
[list]
继承Thread类,覆盖run方法
实现Runnable接口,通过Thread类的带Runnable参数的构造函数传入到Thread对象内,一种常用的方式:
[/list]
运行线程:
调用Thread的start方法,调用之后,JVM启动一个新的线程,在新线程中执行该线程对象的run方法。
线程启动之后,不能再调用start方法,否则会抛出IllegalThreadStateException
线程的一些自动继承的特性:
如果未指明优先级,则被创建的线程和创建它的线程具有相同优先级。
如果未指明ThreadGroup,则被创建的线程和创建它的线程使用相同的ThreadGroup。如果指定ThreadGroup为null,则系统会自动将本线程加入系统级的ThreadGroup。所以说不存在没有ThreadGroup的线程。
如果未指明是否守护线程,则被创建的线程和创建它的线程具有相同的daemon属性。也就是说守护线程创建的线程如果未特别指定,则是守护线程,用户线程创建的线程如果未特别指定,则是用户线程。setDaemon只有在start()方法之前调用才有效。
守护线程和用户线程:
当最后一个用户线程终止的时候,所有守护线程将被“终止”(不是被interrupt),虚拟机退出。即使守护线程是个死循环。以下代码放入main方法里:
[/list]
线程优先级:
线程优先级范围是1-10,1最低优先级10最高优先级。
优先级越高越先被JVM从“等待运行”(waiting-to-run)的状态挑选出来运行。
JVM线程和操作系统线程的关系有2种(甚至可能是3种,依赖于平台和JVM实现): [list=1]
n-1关系,所有JVM线程都在同一个OS线程中运行。
n-m关系,一个JVM线程是可以在多个OS线程中运行,一个OS线程可运行多个JVM线程,不管硬件是多核还是单核。
1-1关系,一个JVM线程对应一条OS进程。(早期JVM的在Linux上的实现版本)
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
线程的一些特性:
所有的Java代码都是在某个线程中执行的,所以在任一行Java代码中使用Thread.currentThread()都可以得到当前运行线程。
JVM允许多个线程并发执行,虽然同一时刻只能有一个线程占用CPU,但每个线程占有的时间片非常短,所以人类的感官上多个线程是并发执行的。
当 JVM启动时,至少有一个用户线程运行,即执行某个类的main方法的线程。
线程在下列情况之一终止运行:
Thread.run方法运行完毕(或者是Thread包含的Runnable对象的run方法执行完毕)
run方法内的代码运行时发生异常。
JVM在下列情况下终止运行:
所有非守护线程(即用户线程,非daemon线程)终止。假如有main线程和另外一个用户线程在运行,即使main线程终止了,还必须等待另外一个线程终止JVM才会终止。
调用了Runtime类的exit方法(启动虚拟机的关闭序列)。
外部程序强行终止虚拟机执行(非正常退出)。
创建线程:
[list]
继承Thread类,覆盖run方法
实现Runnable接口,通过Thread类的带Runnable参数的构造函数传入到Thread对象内,一种常用的方式:
Thread t=new Thread(new Runable(){ public void run(){ //do something } });
[/list]
运行线程:
调用Thread的start方法,调用之后,JVM启动一个新的线程,在新线程中执行该线程对象的run方法。
线程启动之后,不能再调用start方法,否则会抛出IllegalThreadStateException
线程的一些自动继承的特性:
如果未指明优先级,则被创建的线程和创建它的线程具有相同优先级。
如果未指明ThreadGroup,则被创建的线程和创建它的线程使用相同的ThreadGroup。如果指定ThreadGroup为null,则系统会自动将本线程加入系统级的ThreadGroup。所以说不存在没有ThreadGroup的线程。
如果未指明是否守护线程,则被创建的线程和创建它的线程具有相同的daemon属性。也就是说守护线程创建的线程如果未特别指定,则是守护线程,用户线程创建的线程如果未特别指定,则是用户线程。setDaemon只有在start()方法之前调用才有效。
守护线程和用户线程:
当最后一个用户线程终止的时候,所有守护线程将被“终止”(不是被interrupt),虚拟机退出。即使守护线程是个死循环。以下代码放入main方法里:
View Code//请等待足够久的时间(可能是1-2分钟),程序会自动停止。 Thread t1=new Thread(){ public void run(){ int i=0; while(true){//死循环 i++; System.out.println(i); //Thread.yield();//如果想让t2有机会更快完成,需要调用yield让出CPU时间。 } } }; t1.setDaemon(true);//注释掉这句就可以看出区别了。 Thread t2=new Thread(){ public void run(){ int i=50000; while(i>0){ i--; } System.out.println("t2 done"); } }; t1.start(); t2.start();
[/list]
线程优先级:
线程优先级范围是1-10,1最低优先级10最高优先级。
优先级越高越先被JVM从“等待运行”(waiting-to-run)的状态挑选出来运行。
JVM线程和操作系统线程的关系有2种(甚至可能是3种,依赖于平台和JVM实现): [list=1]
n-1关系,所有JVM线程都在同一个OS线程中运行。
n-m关系,一个JVM线程是可以在多个OS线程中运行,一个OS线程可运行多个JVM线程,不管硬件是多核还是单核。
1-1关系,一个JVM线程对应一条OS进程。(早期JVM的在Linux上的实现版本)
相关文章推荐
- Java线程的一些整理
- java的反射技术功能十分强大,整理一些资料!!
- 牛客网Java选择题的一些整理
- Java知识点<15> 线程并发相关 - 全面整理
- Java学习笔记---基本类型、运算优先级的一些知识整理
- Java多线程学习笔记——从Java JVM对多线程数据同步的一些理解
- 【转】 Java大数的一些整理体会
- Java线程(学习整理)--3--简单的死锁例子
- java与线程相关的一些重要方法1(不涉及并发包)-Object的wait(long timeout)和wait()
- Java线程休眠_动力节点Java学院整理
- java基础知识整理 一些问题的解答(面试)
- CodeReview是开发中的重要一个环节,整理了一些关于jupiter for java
- 整理的一些Java基础概念
- java中线程sleep和加锁synchronized 关键字的一些区别
- Java线程的生命周期和状态控制_动力节点Java学院整理
- java中等待一些线程执行完之后,再去执行别的方法(后者需要使用前者返回的结果)
- Java 线程的状态与一些方法
- 对Java CAS的一些了解(正在整理学习中)
- 整理一些java基础面试题
- Java面试整理 关于线程