java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java线程中断和同步

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

作者:魈太凶

本文主要介绍了java线程的中断和同步问题的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

2、手动中断:

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

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

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

使用场景

 线程同步问题

同步解决方案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线程中断和同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文