Java线程初步
来源:互联网 发布:域名过户流程 编辑:程序博客网 时间:2024/06/11 19:23
先上一个实例:两个人各自有3000块钱,要分别存入同一个账户,但是每个人每次只能存入1000块,要求每次存完钱后打印账户余额。
package thread.first;//使用继承的方式实现多线程class People extends Thread{ //两个属性必须设置为静态的,让不同的对象共用 private static int money; private static Object object=new Object(); public void run(){ show(); } public void show(){ synchronized (object) {//同步代码块,不同的对象共用一把锁 for(int i=3;i>0;i--){ money+=1000; System.out.println(Thread.currentThread().getName()+":"+money); } } }}public class TestCount { public static void main(String[] args) { People man1=new People(); People man2=new People(); man1.start(); man2.start(); }}/* 输出结果: * Thread-0:1000 * Thread-0:2000 * Thread-0:3000 * Thread-1:4000 * Thread-1:5000 * Thread-1:6000*/
使用继承的方式有很多缺点,具体对比实现的方式,上代码:
package thread.first;//实现的方式实现多线程class Man implements Runnable{ private int money=0;//不需要定义为static,多线程共用一个对象 public synchronized void run(){//同步方法,因为多线程共用一个对象,所以锁为当前对象 for(int i=3;i>0;i--){ money+=1000; System.out.println(Thread.currentThread().getName()+":"+money); } }}public class TestCount { public static void main(String[] args) { Man people=new Man(); //只需要一个对象 Thread t1=new Thread(people); Thread t2=new Thread(people); t1.start(); t2.start(); }}/* */
线程通信,最经典的例子就是生产者消费者模型,上代码:
package thread.first;class Clerk{//店员类,用来协调生产者和消费者 int productNum;//商品数目,假设店里最多放入5个商品 public synchronized void add(){ if(productNum<5){ try { Thread.currentThread().sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } productNum++; System.out.println("生产者生产了第"+productNum+"个商品"); notifyAll(); }else{//如果等于5了,让生产者等待 try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public synchronized void reduce(){ if(productNum>0){ try { Thread.currentThread().sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("消费者消费了第"+productNum+"个商品"); productNum--; notifyAll(); }else{//没有商品了,让消费者等待 try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}class Producer implements Runnable{ Clerk clerk; public Producer(Clerk clerk){ this.clerk=clerk; } public void run(){ //System.out.println("生产者生产产品"); while(true){ clerk.add(); } }}class Customer implements Runnable{ Clerk clerk; public Customer(Clerk clerk){ this.clerk=clerk; } public void run(){ //System.out.println("消费者消费产品"); while(true){ clerk.reduce(); } }}public class TestProCustomer { public static void main(String[] args) { Clerk clerk=new Clerk(); Producer producer1=new Producer(clerk); Producer producer2=new Producer(clerk); Customer customer1=new Customer(clerk); Customer customer2=new Customer(clerk); Thread t1=new Thread(producer1); Thread t2=new Thread(producer2); Thread t3=new Thread(customer1); Thread t4=new Thread(customer2); t1.start(); t2.start(); t3.start(); t4.start(); }}/*生产者生产了第1个商品生产者生产了第2个商品消费者消费了第2个商品消费者消费了第1个商品生产者生产了第1个商品生产者生产了第2个商品生产者生产了第3个商品生产者生产了第4个商品生产者生产了第5个商品消费者消费了第5个商品消费者消费了第4个商品*/
阅读全文
1 0
- java线程初步学习
- JAVA初步认识线程
- Java线程初步
- Java线程初步1
- java中的线程初步
- JAVA 线程初步
- Java线程初步
- java中线程初步了解
- JAVA线程的初步学习
- JAVA线程初步了解1
- Java线程安全初步了解
- java学习笔记-线程的初步研究
- java并发编程--线程池初步
- java并发编程--线程池初步
- Java的四种线程初步认识
- Java---线程池的初步了解
- Java线程初步了解2-售票系统
- JAVA学习线程的初步理解
- Binder通信——用户空间C/C++层架构与Java层对接点概述
- spring mvc配置json转换器,jar包冲突导致配置无效
- ubuntu sudo apt-get install时遇到问题E: Sub-process /usr/bin/dpkg returned an error code (1)
- 选项卡react-native-scrollable-tab-view
- [Leetcode] 290. Word Pattern 解题报告
- Java线程初步
- 机器学习在线学习算法--迭代器实现
- OpenSessionInViewFilter 的配置及作用
- Python类的继承
- JAVA设计模式-概要
- div和span的区别
- 第一个缺失的正整数
- java-面向对象/类
- OpenGL内核模式学习笔记第0篇——写在开篇