【黑马程序员】java中-------------多线程Thread类
来源:互联网 发布:java后端接收json数据 编辑:程序博客网 时间:2024/05/16 02:02
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、线程
进程的定义:是一个正在执行中的程序,每一个进程执行度有一个执行顺序,该顺序是一个执行路径或者叫一个控制单元
线程的定义:就是进程中的一个独立的控制单元,线程在控制着进程的执行
一个进程至少有一个进程
创建线程的第一种方式:
继承Thread类,复写run方法,调用线程的start()方法;run方法中存放着线程要执行的代码
二、多线程存在的意义
1、比如我们开启jvm,执行某段代码,器他里面包含两条线程控制着,其中main函数由一条线程控制着,依次执行代码。
二第二条线程则控制着虚拟机的垃圾回收器。只有内存中产生垃圾,这个线程就会启动,负责会垃圾(所谓的垃圾回收)
多线程不就可以提高程序运行的效率,而且可以可以提高性能
2、比如说我们生活中,多窗口火车售票系统,就是应用到了多线程,多个窗口同时共享同一个售票系统中的票。
单线程是无法做到的
三、线程的运行状态:5种
四、创建线程
1、java中已经提供了操作线程的类:thread类
2、创建线程有两种方式,
a、第一种方式,自定义一个类extends继承thread类,并复写父类中run()方法
class Test extends Thread{public void run(){for(int x=0;x<15;x++){System.out.println(Test.currentThread().getName()+"目标");}}}class ThreadTest1{public static void main(String[] args){Test t1=new Test();Test t2=new Test();t1.start();t2.start();
/*卖票程序---第一种方式:继承Thread类复写run方法*/class Ticket implements Runnable{private int ticket=100;public void run(){while (ticket>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"--------"+ticket--);}}}class TicketDemo{public static void main(String[] args){Ticket ti=new Ticket();Thread t1=new Thread(ti);Thread t2=new Thread(ti);Thread t3=new Thread(ti);Thread t4=new Thread(ti);t1.start();t2.start();t3.start();t4.start();}}
创建线程的第二种方式:
实现Runnable接口,覆盖run方法。
并且将Runnable接口的子类对象作为参数传递给Thread线程对象
调用start()方法开启线程
继承与实现的区别:
利:避免了单继承的局限性
1.继承Thread类,线程代码存放在Thread子类的run方法中
2.实现Runnable接口,线程代码存放在接口的子类的run()方法中
/*z在使用线程时:建议使用implements实现Runnable接口,复写run方法因为java支持单继承,多实现*class ThreadTest{public static void main(String[] args){Ticket t=new Ticket();Thread t1=new Thread(t);Thread t2=new Thread(t);t1.start();t2.start();}}class Ticket implements Runnable{private int tick=100;Object obj=new Object();public void run(){while(true){ synchronized(obj){ try{Thread.sleep(5);} catch(Exception e){} if(tick>0){ System.out.println(Thread.currentThread().getName()+"价值"+tick--); } }}}}
线程安全问题:
利用同步锁机制:synzhronized
同步代码块和同步函数
利:解决了多线程的安全问题
弊:较为耗费资源
/*在银行,两个储户在给同一个账户 存钱,每个人存300元,每次各存100*/class Bank{private int sum;public synchronized void add(int n){sum=sum+n;try{Thread.sleep(10);}catch(Exception e){System.out.println("交易失败");}System.out.println("sum"+sum);}}class Cus implements Runnable{private Bank b=new Bank();public void run(){for(int x=0;x<3;x++){b.add(100);}}}class BankDemo{public static void main(String[] args){Cus c=new Cus();Thread t1=new Thread(c);Thread t2=new Thread(c);t1.start();t2.start();}}
jdk1.5中,提供了多线程升级的解决方案:
将同步synchronized替换成实现Lock操作,将Object中的wait, notify, notifyAll替换成Condition对象
通过建立Lock接口的子类(RiintreantLock)对象,newCondition()方法获取Condition对象
使用Condition对象中的保证相册同步的方法:await(); signal(); signalAll();
例子:生产者与消费者
/*生产者,消费者练习jdk1.5新特性:java.util.concurrent.lock包中接口Lock :lock(); unlock()f方法 已替代了synchronized函数和synchronized代码块接口Condition :awit(); signal(); signalAll()方法已替代wit(); notify(); notifyAll()方法*/import java.util.concurrent.locks.*;class GonChan{private String name;private int count=1;private boolean flag=false;private Lock lock=new ReentrantLock();private Condition condition_s=lock.newCondition();private Condition condition_x=lock.newCondition();public void set(String name)throws InterruptedException{lock.lock();try{while(flag)condition_s.await();this.name=name+"---"+count++;System.out.println(Thread.currentThread().getName()+"-----生产者-----"+this.name);flag=true;condition_x.signal();}finally{lock.unlock();}}public void out()throws InterruptedException{lock.lock();try{while(!flag)condition_x.await();System.out.println(Thread.currentThread().getName()+"-------------------消费者-----"+this.name);flag=false;condition_s.signal();}finally{lock.unlock();}}}class Sheng implements Runnable{private GonChan g;Sheng(GonChan g){this.g=g;}public void run(){while(true)try{g.set("商品");}catch(Exception e){}}}class Xiao implements Runnable{private GonChan g;Xiao(GonChan g){this.g=g;}public void run(){while(true)try{g.out();}catch(Exception e){}}}class ShengXiaoDemo{public static void main(String[] args ){GonChan gc=new GonChan();Sheng sh=new Sheng(gc);Xiao xi=new Xiao(gc);new Thread(sh).start();new Thread(xi).start();}}
Thread类中的方法:
/ intrttupt(); (清除线程状态) 抛异常:InterruptException
/ setDaemon(boolean on) 守护线程
/ join() 等待该线程停止
/ yield() 用于临时释放执行权,使得线程执行的很平均
/ setPriority(int newPriority)更改线程的优先级
- 【黑马程序员】java中-------------多线程Thread类
- 黑马程序员__Java多线程Thread
- 黑马程序员 java基础 继承thread多线程学习日志
- 黑马程序员--Java多线程的两种实现方式:继承Thread类 & 实现Runable接口
- 黑马程序员-Java基础--Thread类
- 黑马程序员-----java基础中多线程
- 黑马程序员+对Java中多线程总结
- 黑马程序员-java-线程(Thread)
- 31.黑马程序员-多线程(继承Thread)
- 黑马程序员-------------多线程基础概述(Thread -- Runable)
- 黑马程序员-java多线程
- 黑马程序员--java 多线程
- 黑马程序员-java多线程
- 黑马程序员--Java多线程
- 黑马程序员--java多线程
- 黑马程序员:Java多线程
- 黑马程序员 Java多线程
- 黑马程序员---Java多线程
- python 连接sql server
- C++线性方程求解
- LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
- 删除项目中的.svn文件
- java程序员修炼之道
- 【黑马程序员】java中-------------多线程Thread类
- HDU4288:Coder(线段树单点更新版 && 暴力版)
- C++ 新的类型转换(const_cast)
- 关于产品的一些思考——腾讯之UIDesigner
- windows下nginx+php简单配置
- 豆浆机清洗应彻底 如何清洗豆浆机
- 建设高关连度模式 环节词钻研的基础成分
- 公钥加密算法
- [Java]Java基础