java线程的中断和同步问题的实现

 更新时间:2024年07月18日 09:29:38   作者:魈太凶  
本文主要介绍了java线程的中断和同步问题的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、自动终断【完成】:一个线程完成执行后(即run方法执行完毕),不能再次运行 。

2、手动中断:

stop( ) —— 已过时,基本不用。(不安全,就像是突然停电)

interrupt( ) ——此方法只是改变中断状态,不会中断一个正在运行的线程。比如:如果当前线程是阻塞状态,那么就结束阻塞状态

3、可通过使用一个标志指示 run 方法退出,从而终止线程(推荐使用)

使用场景

  • 点击某个桌面应用中的取消按钮时;
  • 某个操作超过了一定的执行时间限制需要中止时;
  • 多个线程做相同的事情,只要一个线程成功其它线程都可以取消时;
  • 一组线程中的一个或多个出现错误导致整组都无法继续时;
  • 当一个应用或服务需要停止时
  • interrupt( )方法说明:interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

 线程同步问题

同步解决方案synchronized

1.在java语言中,引入了同步锁的概念,每个对象都有一个与之关联的内部锁(排他锁),用以保证共享数据的安全性问题。

2.关键词synchronized用来给某个方法或某段代码加上一个同步锁。

3.当调用者调用此方法时,必须获得这把锁才可以调用。

4.当某个调用者获得这把锁之后,其他调用者就无法获得了。

5.当调用结束后,调用者释放这把锁,此时其他调用者才可以获得。

6.这个机制保障了某个同步方法同时只能有一个调用者

锁定方法

public class Account {
    private int balance = 1000;
    public  synchronized void qu(){ // 同步方法
        if(balance>=1000){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            balance -= 1000;
            System.out.println("取了1000元,balance = " + balance);
        }
    }
}

 锁定代码块

public class Account {
    private int balance = 1000;
    public   void qu(){
        System.out.println("Account.qu");
        synchronized( "this" ){ // 同步块
            if(balance>=1000){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                balance -= 1000;
                System.out.println("取了1000元,balance = " + balance);
            }
        }
    }
}

死锁

线程同步的第二种解决方案 wait() notify()

生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个线程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它

package test06;
//仓库(有界缓冲区)
class Storage{
	private int count = 0;
	public synchronized void set(){
		if(count>=5){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		count++;
		System.out.println("生产了一个,仓库中有:" + count);
		this.notify();
	}
	public synchronized void get(){
		if(count<=0){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		count--;
		System.out.println("消费了一个,仓库中有:" + count);
		this.notify();
	}
}
//生产者
class Producer extends Thread{
	private Storage storage;
	public Producer(Storage storage){
		this.storage = storage;
	}
	public void run(){
		for(int i=0;i<50;i++){
			this.storage.set();
		}
	}
}
//消费者
class Customer extends Thread{
	private Storage storage;
	public Customer(Storage storage){
		this.storage = storage;
	}
	public void run(){
		for(int i=0;i<50;i++){
			this.storage.get();
		}
	}
}
public class Test2 {
	public static void main(String[] args) {
		Storage storage = new Storage();
		Producer producer = new Producer(storage);
		Customer customer = new Customer(storage);
		
		customer.start();
		producer.start();
	}
}

到此这篇关于java线程的中断和同步问题的实现的文章就介绍到这了,更多相关java线程中断和同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java中List<T> Map与Map List<T>的区别小结

    Java中List<T> Map与Map List<T>的区别小结

    本文主要介绍了Java中List<T> Map与Map List<T>的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • JAVA动态代理模式(从现实生活角度理解代码原理)

    JAVA动态代理模式(从现实生活角度理解代码原理)

    本文主要介绍了JAVA动态代理模式(从现实生活角度理解代码原理)的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 关于Scanner对象的输入结束标记问题

    关于Scanner对象的输入结束标记问题

    这篇文章主要介绍了关于Scanner对象的输入结束标记问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 详解Springboot应用启动以及关闭时完成某些操作

    详解Springboot应用启动以及关闭时完成某些操作

    这篇文章主要介绍了详解Springboot应用启动以及关闭时完成某些操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • SpringBoot整合sharding-jdbc实现自定义分库分表的实践

    SpringBoot整合sharding-jdbc实现自定义分库分表的实践

    本文主要介绍了SpringBoot整合sharding-jdbc实现自定义分库分表的实践,将通过自定义算法来实现定制化的分库分表来扩展相应业务,感兴趣的可以了解一下
    2021-11-11
  • 最全JVM调优步骤和参数及配置

    最全JVM调优步骤和参数及配置

    这篇文章主要给大家介绍了关于JVM调优的相关资料,JVM调优是指对Java虚拟机(JVM)进行优化,以提高Java程序的性能和运行效率,文中介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 解析Idea为什么不推荐使用@Autowired进行Field注入

    解析Idea为什么不推荐使用@Autowired进行Field注入

    这篇文章主要介绍了Idea不推荐使用@Autowired进行Field注入的原因,网上文章大部分都是介绍两者的区别,没有提到为什么,当时想了好久想出了可能的原因,今天来总结一下
    2022-05-05
  • Springboot基于enable模块驱动的实现

    Springboot基于enable模块驱动的实现

    这篇文章主要介绍了Springboot基于enable模块驱动的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • hibernate中的对象关系映射

    hibernate中的对象关系映射

    hibernate中的ORM映射文件通常以.hbm.xml作为后缀。使用这个映射文件不仅易读,而且可以手工修改,也可以通过一些工具来生成映射文档,下文给大家详细的介绍hibernate中的对象关系映射,需要的朋友参考下吧
    2017-09-09
  • spring用户通过交互界面登录成功的实现

    spring用户通过交互界面登录成功的实现

    本文主要介绍了spring用户通过交互界面登录成功的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论