标签:des style blog http color java 使用 os io
线程的概述:
线程是程序的多个执行路径,执行调度的单位,依托于进程存在。线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系统分配的,主要用来保存线程内部的数据,如线程执行函数中定义的变量。
java中多线程是一种抢占机制而不是分时机制。抢占机制是指CPU资源师被多个线程所共享,多个线程处于可运行状态,但是只允许一个线程在运行,他们通过竞争的方式抢占CPU.可以参考java 进程与线程的区别
线程的状态:
线程的方法和属性:
object.wait():用在同步中,如果不在锁中使用会抛出IllegalMonitorStateException异常。使线程处于阻塞状态,是线程进入等待池中,释放锁,释放执行权
Synchronizing Block:机锁具有独占性、一旦被一个Thread持有,其他的Thread就不能再拥有(不能访问其他同步方法),方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
下面给出上面方法的测试代码:
yield(),join(),priority属性的测试,其它方法不测试了,在是我的文章里面可以看到:
设计两个线程,一个线程为主线程,一个线程Thread-0:
代码:没有用Join方法主线程和Thread-0交替的执行。大家都知道,这里不测试了。但是用了join方法大家看效果.
package com.lp.ecjtu.Thread; /** * * @author Administrator * 当A线程执行到B线程的Join方法时,A就会等待,等B线程执行完之后,A线程才会执行 * Join方法可以用来临时加入线程执行 */ class Join implements Runnable{ @Override public void run() { //Thread.yield();//暂停正在执行的先线程对象,并执行其它对象。稍微释放执行权一会儿 for(int i=0;i<20;i++){ //复写父类的toString方法, 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。 //Thread[Thread-1,5,main]默认的优先级为5,优先级从1-10 System.out.println(Thread.currentThread().toString()+"-"+i); } } } public class JoinDemo { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { Join join = new Join(); Thread t1 = new Thread(join); Thread t2 = new Thread(join); //t1.setPriority(Thread.MAX_PRIORITY);//设置线程的优先级的方法 t1.start(); t2.join();//某个时刻join方法使t2临时加入线程,抢夺主线程的CPU权,直到t2执行完后,t1执行 t2.start(); } }
输出结果:
Thread[Thread-0,5,main]-0
Thread[Thread-1,5,main]-0
Thread[Thread-1,5,main]-1
Thread[Thread-1,5,main]-2
Thread[Thread-1,5,main]-3
Thread[Thread-1,5,main]-4
Thread[Thread-1,5,main]-5
Thread[Thread-1,5,main]-6
Thread[Thread-1,5,main]-7
Thread[Thread-1,5,main]-8
Thread[Thread-1,5,main]-9
Thread[Thread-1,5,main]-10
Thread[Thread-1,5,main]-11
Thread[Thread-1,5,main]-12
Thread[Thread-1,5,main]-13
Thread[Thread-1,5,main]-14
Thread[Thread-1,5,main]-15
Thread[Thread-1,5,main]-16
Thread[Thread-1,5,main]-17
Thread[Thread-1,5,main]-18
Thread[Thread-1,5,main]-19
Thread[Thread-0,5,main]-1
Thread[Thread-0,5,main]-2
Thread[Thread-0,5,main]-3
Thread[Thread-0,5,main]-4
Thread[Thread-0,5,main]-5
Thread[Thread-0,5,main]-6
Thread[Thread-0,5,main]-7
Thread[Thread-0,5,main]-8
Thread[Thread-0,5,main]-9
Thread[Thread-0,5,main]-10
Thread[Thread-0,5,main]-11
Thread[Thread-0,5,main]-12
Thread[Thread-0,5,main]-13
Thread[Thread-0,5,main]-14
Thread[Thread-0,5,main]-15
Thread[Thread-0,5,main]-16
Thread[Thread-0,5,main]-17
Thread[Thread-0,5,main]-18
Thread[Thread-0,5,main]-19
可以看到蓝色的部分,某个时刻t2通过join方法强到执行权,执行完后,Thread-0执行。
例子2,优先级测试
package com.lp.ecjtu.Thread; /** * * @author Administrator * 当A线程执行到B线程的Join方法时,A就会等待,等B线程执行完之后,A线程才会执行 * Join方法可以用来临时加入线程执行 */ class Join implements Runnable{ @Override public void run() { for(int i=0;i<20;i++){ //复写父类的toString方法, 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。 //Thread[Thread-1,5,main]默认的优先级为5,优先级从1-10 System.out.println(Thread.currentThread().toString()+"-"+i); } } } public class JoinDemo { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { Join join = new Join(); Thread t1 = new Thread(join); Thread t2 = new Thread(join); t2.setPriority(Thread.MAX_PRIORITY);//设置线程的优先级的方法 t1.start(); t2.start(); } }
输出结果:
Thread[Thread-1,10,main]-0
Thread[Thread-1,10,main]-1
Thread[Thread-1,10,main]-2
Thread[Thread-1,10,main]-3
Thread[Thread-1,10,main]-4
Thread[Thread-1,10,main]-5
Thread[Thread-1,10,main]-6
Thread[Thread-0,5,main]-0
Thread[Thread-1,10,main]-7
Thread[Thread-1,10,main]-8
Thread[Thread-0,5,main]-1
Thread[Thread-1,10,main]-9
Thread[Thread-1,10,main]-10
Thread[Thread-1,10,main]-11
Thread[Thread-1,10,main]-12
Thread[Thread-1,10,main]-13
Thread[Thread-1,10,main]-14
Thread[Thread-1,10,main]-15
Thread[Thread-1,10,main]-16
Thread[Thread-1,10,main]-17
Thread[Thread-1,10,main]-18
Thread[Thread-0,5,main]-2
Thread[Thread-1,10,main]-19
Thread[Thread-0,5,main]-3
Thread[Thread-0,5,main]-4
Thread[Thread-0,5,main]-5
Thread[Thread-0,5,main]-6
Thread[Thread-0,5,main]-7
Thread[Thread-0,5,main]-8
Thread[Thread-0,5,main]-9
Thread[Thread-0,5,main]-10
Thread[Thread-0,5,main]-11
Thread[Thread-0,5,main]-12
Thread[Thread-0,5,main]-13
Thread[Thread-0,5,main]-14
Thread[Thread-0,5,main]-15
Thread[Thread-0,5,main]-16
Thread[Thread-0,5,main]-17
Thread[Thread-0,5,main]-18
Thread[Thread-0,5,main]-19
总结:从结果可以看出Thread-1,10,main优先级为10的线程2先执行。
yield方法是正在执行的线程释放执行权,暂停执行一小会儿。这里不测了。。。。。。
java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍
标签:des style blog http color java 使用 os io
原文地址:http://www.cnblogs.com/200911/p/3929190.html