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