JAVA中关于多线程的理解

学习了JAVA的多线程以后,感悟颇多,对进程,线程有了一个更直接的认识。

线程是位于进程之下的更小的单位,线程与线程之间存在争夺关系,多个线程共享内存,从而提高了执行效率,也会相互争夺cpu资源竞相执行相关对象的代码段。

遇到一道例题,较充分的展现了线程的相关主要操作,分析如下:

例题:

编写一个多线程程序实现如下功能:线程A和线程B分别在屏幕上显示信息“„start”后,调用wait等待;线程C开始后调用sleep休眠一段时间,然后调用notifyall,使线程A和线程B继续运行。线程A和线程B恢复运行后输出信息“„end”后结束,线程C在判断线程B和线程A结束后自己结束运行。

package 多线程;

public class T4 {
	
	
	public synchronized void Wait(String s){
		System.out.println(s + "...start");
		try {
			wait(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//notifyAll();
		System.out.println(s +"...end");
	}
	
	public synchronized void NotifyAll(){
		notifyAll();
	}
	
	Thread A = new Thread ("A"){
		public void run(){
			Wait("A");
		}
	};
		
	Thread B = new Thread ("B"){
		public void run(){
			Wait("B");
		}
	};
		
	Thread C = new Thread ("C"){
		public void run(){
			try{
				sleep(1000);
			} catch(Exception s){
					
			}
		NotifyAll();
		if(!A.isAlive() && !B.isAlive()){
			return ;
			}
		}
	};
	public static void main(String[] args) {
		T4 t = new T4();
		t.A.start();
		t.B.start();
		t.C.start();
	}
}
该例题看似简单,但是编写起来却有一定的阻塞。

执行顺序为:

创建类T4——创建线程A、B、C——主函数里执行线程A、B、C

同时,线程A、B里调用了Wait()方法,Wait()方法是公有的,且被关键字

synchronized


修饰。synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

     一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

     二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

     三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

     四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

     五、以上规则对其它对象锁同样适用.

Wait方法最后还调用了notifyall()方法,用于通知处在等待该对象的线程,令等待的线程(C)开始执行。
posted @ 2017-05-27 23:01  我是王博  阅读(195)  评论(0编辑  收藏  举报