黑马程序员——多线程
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方法。
需求:简单的卖票小程序,多个窗口同时卖票。(第二种方式)
Java对于多线程的安全问题提供了专业的解决方式,一个是同步代码块synchronized。
另一种是JDK1.5提供了多线程升级解决方案。将synchronized替换成显式的Lock操作。将Object中的wait,notify,notifyAll替换成了Condition对象,该对象可以通过Lock锁进行获取。
下面是多线程安全问题的例题:
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
一个进程中至少有一个线程。
创建线程的第一种方式:继承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) { } } } }
相关文章推荐
- 黑马程序员-多线程(上)
- 黑马程序员——javaSE_多线程
- Java基础---多线程 (黑马程序员)
- 黑马程序员 JAVASE——多线程安全(并发问题和死锁等)
- [黑马程序员]多线程_安全
- 黑马程序员---Java多线程(1)
- 黑马程序员------多线程
- 【黑马程序员】第五章:多线程
- 黑马程序员_ 多线程
- 黑马程序员——多线程
- 黑马程序员学习日志——多线程的同步
- 黑马程序员——javase基础--多线程
- 黑马程序员——Java基础---理解多线程
- 黑马程序员--java多线程
- 黑马程序员-Java基础:多线程
- 黑马程序员——Java重点基础之多线程(二)
- 黑马程序员_java多线程
- 黑马程序员_多线程(1)
- 黑马程序员————Java基础之多线程
- 黑马程序员_多线程