Java多线程(二)
来源:互联网 发布:淘宝的试用报告怎么写 编辑:程序博客网 时间:2024/05/22 01:40
在线程中启动启动其他线程
线程通过调用star()方法将启动该线程,使之从新建状态进入就绪队列排队。一旦轮到它享用CPU资源的时候,就可以脱离创建它的主线程,开始自己的生命周期。
线程一计算完1+2+…+50,线程二继续计算51+52+…+100。
package com.thread;public class MultiThread_StartOtherThread { public static void main(String[] args) { Calculate cal = new Calculate(); Thread thread1 = new Thread(cal); thread1.setName("1"); thread1.start(); }}class Calculate implements Runnable{ int i=1 , sum=0;//线程共享数据 public void run() { Thread thread =Thread.currentThread(); while(i<=100){ sum = sum+i; if(i==50){ System.out.println(thread.getName()+":"+sum); Thread thread2 = new Thread(this);//thread2与thread1的目标对象相同 thread2.setName("2"); thread2.start(); i++; return;//thread1死亡 } i++; try{ Thread.sleep(20); }catch(InterruptedException e){} } System.out.println(thread.getName()+":"+sum); }}
线程的interrupt()方法
interrupt()方法的功能是中断线程。
若当前线程没有中断它自己或当前线程无法修改该线程,则该线程的checkAccess方法会被调用,这可能抛出SecurityException。
若线程在调用Object类的wait(),join(),sleep()方法中受阻,则其中断状态将被清除,收到一个InterruptException异常。
若该线程在可中断通道上的I/O操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程收到一个ClosedByInterruException异常。
使用interrupt()中断线程方法,让一个线程唤醒另一个休眠线程。
package com.thread;public class MultiThread_interrupt { public static void main(String[] args) { Room room = new Room(); room.student.start(); room.teacher.start(); }}class Room implements Runnable{ Thread student,teacher; Room(){ student = new Thread(this); teacher = new Thread(this); student.setName("Student"); teacher.setName("Teacher"); } public void run() { if(Thread.currentThread()==student){ try{ System.out.println("Student is sleeping"); Thread.sleep(1000*60); }catch(InterruptedException e){ System.out.println("wake up"); } System.out.println("listen class"); } else if(Thread.currentThread()==teacher){ System.out.println("teacher say begin class"); try{ Thread.sleep(200); }catch(InterruptedException e){} student.interrupt();//唤醒Student } }}
线程的同步
一个Java程序的多线程间可以共享数据,就存在两个或多个线程同时使用相同且有限资源的可能性,这样就可能产生冲突。
多线程的同步,就是使多个访问同一个数据的线程,按序进行,以免数据出错。当一个线程处理某数据时,其他欲访问改数据的线程必须等待,直到前一线程处理改数据完毕。
Java采用synchronized关键词来实现同步。其原理是赋予该对象唯一的一把“钥匙”(也叫“同步锁”),当多个线程进入对象,只有取得对象钥匙的进程,才可以访问同步方法,其他线程必须等待,直到该线程用wait()方法放弃这把钥匙,并执行notifyAll()方法通知所有因使用这个同步方法而处于等待的线程,让它们结束等待。
notifyAll():中断的线程会从中断处继续执行这个同步方法,并遵循“先中断先执行”的原则。
模拟三人排队买票,张三,李四,王五。售票员只有三张10元的钱,票10元一张。张三拿着一张50元排第一,李四拿着一张20元排第二,王五拿着一张10元排最后。
package com.thread;public class MultiThread_synchronized { public static void main(String[] args) { Queue queue = new Queue(); queue.zs.start(); queue.ls.start(); queue.ww.start(); }}class Queue implements Runnable{ Saler s; Thread zs,ls,ww; Queue(){ s=new Saler(); zs = new Thread(this); ls = new Thread(this); ww = new Thread(this); } public void run(){ if(Thread.currentThread()==zs){ s.charge(50); }else if(Thread.currentThread()==ls){ s.charge(20); }else if(Thread.currentThread()==ww){ s.charge(10); } }}class Saler{ int number10=3,number20=0,number50=0; public synchronized void charge(int money){ if(money==10){ number10++; System.out.println("收您10元"); } else if(money==20){ while(number10<1){ try{ wait(); }catch(InterruptedException e){} } number10--; number20++; System.out.println("收您20,找零10"); } else if(money==50){ while((10*number10+20*number20)<40){ try{ wait(); }catch(InterruptedException e){} } number50++; if(number20>0){ number20--; number10=number10-2; }else{ number10=number10-4; } System.out.println("收您50,找零40"); } notifyAll(); }}
- java多线程(二)
- JAVA多线程(二)
- java多线程(二)
- Java多线程(二)
- Java多线程(二)
- Java多线程(二)
- Java多线程(二)
- java多线程(二)
- Java多线程(二)
- Java多线程(二)
- java多线程(二)
- java-多线程(二)
- Java多线程(二)
- java多线程(二)
- Java多线程(二)
- Java多线程(二)
- JAVA多线程(二)
- 【Java多线程】(二)多线程同步
- 【java设计模式】之 策略(strategy)模式
- 在程序中鼠标的监听器对用户的行为做出反应
- 苹果大力扩张Apple Pay 即将在韩国等地推出
- mybatis配置文件实现数据库带下横线字段与实体类属性一致的映射
- 【java设计模式】之 责任链(chain of resposibility)模式
- Java多线程(二)
- java enum(枚举)使用详解 + 总结
- 导入csv到数据库,并且传递参数
- 一小时包教会 —— webpack 入门指南
- 按钮添加呼吸灯效果
- 51nod 1003 阶乘后面0的数量
- Qt将数字转为中文大写金额
- [UVa 12166] 修改天平(Equilibrium Mobile)
- Android百大框架排行榜