1、创建线程
Java中有两种方式创建线程,一种是继承Thread类。一种是实现Runnable接口。
建议使用实现Runnable接口的方式创建线程。
2、加入同步
要想达到线程同步,则需在方法前加入synchronized关键字。这样,有synchronized关键字修饰的方法就形成了同步方法。
3、加入等待与唤醒
当一个线程正在进行,则其他进程必须等待。当一个线程操作结束,唤醒等待的线程。
范例:
生产者与消费者模型
生产者与消费者模型中,生产者只有生产出产品,消费者才可以进行消费,此时需要有两个进程,分别表示消费者和生产者。为了是这两个线程正常运行而不出现死锁的现象,就要加入同步机制。
package com.zgy.thread2;
/*
* 定义一个表示电脑的类Computer
*/
public class Computer
{
private String size; //定义变量size,用于表示电脑的型号
private float price; //定义变量price,用于表示电脑的型号
Boolean flag = true;
//分别产生size,price变量对应的setter、getter方法
public String getSize()
{
return size;
}
public void setSize(String size)
{
this.size = size;
}
public float getPrice()
{
return price;
}
public void setPrice(float price)
{
this.price = price;
}
//定义Computer类的produce方法,表示生产电脑
public synchronized void produce(String size,float price) //设置型号和价格
{
if(!flag) //如果为flag为false,不可生产
{
try
{
super.wait(); //等待消费者取走
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
else
{
this.setSize(size);
try
{
Thread.sleep(500); //加入延迟
}
catch(InterruptedException e)
{
e.printStackTrace();
}
this.setPrice(price);
flag = false; //修改标识,flag=false
super.notify(); //唤醒等待的线程
System.out.println("生产电脑型号"+this.size+"——>"+"电脑价格"+this.price);
}
}
//定义Computer类的consum方法,表示消费电脑
public synchronized void consum()
{
if(flag) //如果flag为true,不可消费
try
{
super.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
else
{
try
{
Thread.sleep(500); //加入延迟
}
catch(InterruptedException e)
{
e.printStackTrace();
}
flag = true;
super.notify();
System.out.println("消费电脑型号"+this.size+"——>"+"电脑价格"+this.price);
}
}
}
package com.zgy.thread2;
/**
* 生产类Producer,表示生产电脑
*
*/
public class Producer implements Runnable //定义生产者线程
{
private Computer computer = null; //调用computer引用
public Producer(Computer computer) //通过构造方法设置computer的内容
{
this.computer = computer; //为computer属性初始化
}
public void run() //实现Runnable接口中的抽象方法
{
for(int i = 0 ; i < 2 ; i++) //循环2次
{
this.computer.produce("联想", 4000f);
}
}
}
package com.zgy.thread2;
public class Consumer implements Runnable //定义生产者线程
{
private Computer computer = null; //调用computer引用
public Consumer(Computer computer) //通过构造方法设置computer的内容
{
this.computer = computer;
}
public void run() //实现Runnable中的抽象方法
{
for(int i = 0 ; i < 2 ; i++)
{
try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
this.computer.consum();
}
}
}
package com.zgy.thread2;
public class Test
{
public static void main(String[] args)
{
Computer computer = new Computer(); //创建Computer类的实例
Producer producer = new Producer(computer); //创建Producer类的实例
Consumer consumer = new Consumer(computer); //创建Consumer类的实例
new Thread(producer).start(); //创建生产者线程并启动
new Thread(consumer).start(); //创建消费者线程并启动
}
}