您的位置:首页 > 职场人生

黑马程序员——多线程

2012-04-25 17:29 169 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。

一个进程中至少有一个线程。

创建线程的第一种方式:继承Thread类。

步骤:1、定义类继承Thread.

2、复写Thread类中的run方法。目的:将自定义方法存储在run方法中,让线程运行。

3、调用线程的start方法。该方法两个作用:启动线程,调用run方法。

创建线程的第二种方式:实现Runnable接口

步骤:1、定义类实现Runnable接口。

2、覆盖Runnable接口中的run方法。

3、通过Thread类建立线程对象。

4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

需求:简单的卖票小程序,多个窗口同时卖票。(第二种方式)

class Ticket implements Runnable
{
private int tick=100;
public void run()
{
while(true)
{
if (tick>0)
{
System.out.println(Thread.currentThread().getName()+"~~~~sale:"+tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}

Java对于多线程的安全问题提供了专业的解决方式,一个是同步代码块synchronized。

另一种是JDK1.5提供了多线程升级解决方案。将synchronized替换成显式的Lock操作。将Object中的wait,notify,notifyAll替换成了Condition对象,该对象可以通过Lock锁进行获取。

下面是多线程安全问题的例题:

import java.util.concurrent.locks.*;
class  ProduceConsumerDemo
{
public static void main(String[] args)
{
Resource r=new Resource();
Producer pro=new Producer(r);
Consumer con=new Consumer(r);
Thread t1=new Thread(pro);
Thread t2=new Thread(pro);
Thread t3=new Thread(con);
Thread t4=new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource
{
private String name;
private int count=1;
private boolean flag=false;
private Lock lock=new ReentrantLock();
private Condition condition_pro=lock.newCondition();
private Condition condition_con=lock.newCondition();
public void set(String name) throws InterruptedException
{
lock.lock();
try
{
while(flag)
condition_pro.await();
this.name=name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者。。"+this.name);
flag=true;
condition_con.signal();
}
finally
{
lock.unlock();
}
}
public void out()throws InterruptedException
{
lock.lock();
try
{
while(!flag)
condition_con.await();
System.out.println(Thread.currentThread().getName()+",,,、、、、消费者、、、"+this.name);
flag=false;
condition_pro.signal();
}
finally
{
lock.unlock();
}
}
}
class Producer implements Runnable
{
private Resource res;
Producer(Resource res)
{
this.res=res;
}
public void run()
{
while(true)
{
try
{
res.set("+商品+");
}
catch (InterruptedException e)
{
}

}
}
}
class Consumer implements Runnable
{
private Resource res;
Consumer(Resource res)
{
this.res=res;
}
public void run()
{
while(true)
{

try
{
res.out();
}
catch (InterruptedException e)
{
}
}
}
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息