java线程中的synchronized关键字和sleep()方法(案例)

java线程中的synchronized关键字sleep()方法(案例)

直接po截图和代码

源码点这里

Service类

package com.demo.thread6;

/**
* 
* wait()、notify()、notifyAll()这3个函数,这3个函数都是Object类的方法
* sleep()是Thread类的方法
* 对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属
* 于Object类中的
* sleep()方法导致了线程暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指
* 定的时间到了又会自动恢复运行状态
* 在调用sleep()方法的过程中,线程不会释放对象锁
* 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调
* 用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态
* 
*/
public class Service {

	public synchronized void hello1() {
		System.out.println("我是同步方法hello1()");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("我是同步方法hello1()的结尾部分.......");
	}

	//运行结果有2种情况
	/**
	 * 情况1:
	 *运行结果,有可能是线程2先执行同步方法,执行完后,此时线程1再执行同步方法时,一直在wait,程
	 *序一直在wait,程序一直没结束 
	 */

	/**
	 * 情况2:
	 *运行结果,也有可能是线程1先执行同步方法,然后在执行过程中wait,然后此时释放锁,由线程2执行同步方法,在执
	 *行过程中调用了notifyAll()函数 ,然后唤醒了线程1,线程1继续执行后面的代码
	 * 
	 */
	//同步方法中使用wait()函数
	//wait()、notify()、notifyAll()这3个函数,这3个函数都是Object类的方法
	public synchronized void hello2(int temp) {
		System.out.println("我是同步方法hello2()");
		if (temp == 1) {
			System.out.println("你传的参数是" + temp + ",请等待.....");
			try {
				wait(); //有可能有这么一种情况,就是一直处于等待
				System.out.println("参数" + temp + "等待结束.....");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else if (temp == 2){
			System.out.println("你传的参数是" + temp);
		}
		notifyAll();
		for (int i = 1; i <= 5; i++) {
			System.out.println("[参数:" + temp + "][次数:" + i + "]看看调用了notifyAll()函数后,是继续执行notifyAll()函数后面的代码,还是立刻接着执行wait()的后续代码");
		}
		System.out.println("我是同步方法hello2()的结尾部分.......,参数是" + temp);
	}
	
	//只有当一个线程执行完对象的同步方法之后,另一个线程才会执行同一个对象的同步方法
	//同步方法中使用sleep()函数
	//sleep()是Thread类的方法
	public synchronized void hi(int temp) {
		System.out.println("我是同步方法hi()");
		if (temp == 1) {
			System.out.println("你传的参数是" + temp + ",请等待.....");
			try {
				Thread.sleep(3000);
				System.out.println("参数" + temp + "等待结束.....");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else if (temp == 2){
			System.out.println("你传的参数是" + temp);
		}
		System.out.println("我是同步方法hi()的结尾部分.......,参数是" + temp);
	}

	public void hello3() {
		System.out.println("我是普通方法hello3()");
	}
	
	public synchronized void hello4() {
		System.out.println("我是同步方法hello4()");
	}
	
	public void hello5() {
		System.out.println("我是同步方法hello5()");
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("我是同步方法hello5()的结尾部分.......");
	}

}

A类

package com.demo.thread6;

public class A implements Runnable{

	Service service;
	
	public A(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hello1();
	}

}

B类

package com.demo.thread6;

public class B implements Runnable{

	Service service;
	
	public B(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hello4();
	}

}

C类

package com.demo.thread6;

public class C implements Runnable{

	Service service;
	
	public C(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hello3();
	}

}

D类

package com.demo.thread6;

public class D implements Runnable{

	Service service;
	
	public D(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hello5();
	}

}

E类

package com.demo.thread6;

public class E implements Runnable{

	Service service;
	
	public E(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hello2(1);
	}

}

F类

package com.demo.thread6;

public class F implements Runnable{

	Service service;
	
	public F(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hello2(2);
	}

}

G类

package com.demo.thread6;

public class G implements Runnable{

	Service service;
	
	public G(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hi(1);
	}

}

H类

package com.demo.thread6;

public class H implements Runnable{

	Service service;
	
	public H(Service service) {
		this.service = service;
	}

	@Override
	public void run() {
		service.hi(2);
	}

}

Test类

package com.demo.thread6;

public class Test {

	public static void main(String[] args) {
		Service service = new Service();
		//两个线程同时操作同一个service对象
		A a = new A(service); // 同一个service对象
		B b = new B(service); // 同一个service对象
		
		Thread t1 = new Thread(a, "线程1");
		Thread t2 = new Thread(b, "线程2");
		
		//启动线程
		t1.start();
		t2.start();
	}

}

运行结果:可以多运行几次

运行结果,情况1

运行结果,情况2

Test2类

package com.demo.thread6;

public class Test2 {

	public static void main(String[] args) {
		Service service = new Service();
		//两个线程同时操作同一个service对象
		A a = new A(service); // 同一个service对象
		C c = new C(service); // 同一个service对象
		
		Thread t1 = new Thread(a, "线程1");
		Thread t2 = new Thread(c, "线程2");
		
		//启动线程
		t1.start();
		t2.start();
	}

}

运行结果:可以多运行几次

Test3类

package com.demo.thread6;

public class Test3 {

	public static void main(String[] args) {
		Service service = new Service();
		//两个线程同时操作同一个service对象
		D d = new D(service); // 同一个service对象
		B b = new B(service); // 同一个service对象
		
		Thread t1 = new Thread(d, "线程1");
		Thread t2 = new Thread(b, "线程2");
		
		//启动线程
		t1.start();
		t2.start();
	}

}

运行结果:可以多运行几次

运行结果,情况1

运行结果,情况2

Test4类

package com.demo.thread6;

public class Test4 {

	public static void main(String[] args) {
		Service service = new Service();
		//两个线程同时操作同一个service对象
		E e = new E(service); // 同一个service对象
		F f = new F(service); // 同一个service对象
		
		Thread t1 = new Thread(e, "线程1");
		Thread t2 = new Thread(f, "线程2");
		
		//运行结果有2种情况
		/**
		 * 情况1:
		 *运行结果,有可能是线程2先执行同步方法,执行完后,此时线程1再执行同步方法时,一直在wait,程
		 *序一直在wait,程序一直没结束
		 */

		/**
		 * 情况2:
		 *运行结果,也有可能是线程1先执行同步方法,然后在执行过程中wait,然后此时释放锁,由线程2执行同步方法,在执
		 *行过程中调用了notifyAll()函数 ,然后唤醒了线程1,线程1继续执行后面的代码
		 * 
		 */

		//启动线程
		t1.start();
		t2.start();
	}

}

运行结果:可以多运行几次

运行结果,情况1

运行结果,情况2

Test5类

package com.demo.thread6;

public class Test5 {

	public static void main(String[] args) {
		Service service = new Service();
		
		//只有当一个线程执行完对象的同步方法之后,另一个线程才会执行同一个对象的同步方法
		//两个线程同时操作同一个service对象
		G g = new G(service); // 同一个service对象
		H h = new H(service); // 同一个service对象
		
		Thread t1 = new Thread(g, "线程1");
		Thread t2 = new Thread(h, "线程2");
		
		//启动线程
		t1.start();
		t2.start();
	}

}

运行结果:可以多运行几次

运行结果,情况1

运行结果,情况2

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值