摘要:
在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系。那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三、李四负责生产烤鸭,王五、马六负责吃烤鸭,那么前者生产完烤鸭之后,如果烤鸭没有被吃完的话,这个时候就不再生产了,如果此时烤鸭吃没了,这个时候消费者就要告诉生产者,烤鸭吃没了,你要继续生产烤鸭,否则生产者一直处于等待的状态。如何来用代码体现呢?1、定义两个类,一个是生产者类 Product 一个是消费者类Consume,两个类分别实现Runnable中的run方法。2、Product当中的run方法的任务就是生产烤鸭,Consume当中的run方法中就负责 阅读全文
摘要:
形成死锁的前提是同步代码块嵌套。什么是死锁?当一个线程拿到锁以后在这个锁内部的代码需要访问另一段的代码的时候另外一个程序的锁被另外一个线程拿到,这样的话,就造成了两个锁互不想让程序没法往下执行的这种状况就是死锁。 1 class DeadDemoA implements Runnable 2 { 3 Object obj = new Object(); 4 int x = 0; 5 6 public void run() 7 { 8 9 10 if(x == 0){11 12 while(tr... 阅读全文
摘要:
这一节我们来说一个示例就是卖票示例:需求:我们现在有100张票,然后分四个窗口来卖,直到卖完为止。思路:1、先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run方法。2、定义一个主方法,把这个类当成一个独立的运行程序。3、在主方法当中创建4个线程来卖票。代码: 1 class Ticket implements Runnable 2 { 3 4 int num = 100; 5 6 public void sellT() 7 { 8 9 while(true)10 {11 12 ... 阅读全文
摘要:
我们上一节当中讲到了创建线程的第一种方法,就是继承Thread类,覆写Thread当中的run方法,然后创建子类对象,之后调用对象的start方法启动线程。但是这种方法有一个缺陷,因为我们知道在java当中类与类当中是单继承的关系,假如现在我们的子类是另外一个类的子类,这个时候如果这个子类想使用多线程的话,就没有办法了。我们之前说接口的时候,知道接口的存在就是为了扩展类的功能,而避免多继承。那么有没有一种方法可以通过实现接口来完成多线程的创建呢?我们查阅Api可以知道,在java当中为我们提供了一个Runnable接口。在查阅文档的同时,我们知道在Runnable这个接口当中,只有一个run方 阅读全文