火车上车厢的卫生间,为了简单,这里只模拟一个卫生间,这个卫生间会被多个人同时使用,在实际使用时,当一个人进入卫生间时则会把卫生间锁上,等出来时 打开门,下一个人进去把门锁上,如果有一个人在卫生间内部则别人的人发现门是锁的则只能在外面等待。从编程的角度来看,这里的每个人都可以看作是一个线程 对象,而这个卫生间对象由于被多个线程访问,则就是临界资源,在一个线程实际使用时,使用synchronized关键将临界资源锁定,当结束时,释放锁定。实现的代码如下:

package syn3;

/**

* 测试类

*/

public class TestHuman {

public static void main(String[] args) {

Toilet t = new Toilet(); //卫生间对象

Human h1 = new Human("1",t);

Human h2 = new Human("2",t);

Human h3 = new Human("3",t);

}

}

package syn3;

/**

* 人线程类,演示互斥

*/

public class Human extends Thread {

Toilet t;

String name;

public Human(String name,Toilet t){

this.name = name;

this.t = t;

start(); //启动线程

}

public void run(){

//进入卫生间

t.enter(name);

}

}

package syn3;

/**

* 卫生间,互斥的演示

*/

public class Toilet {

public synchronized void enter(String name){

System.out.println(name + "已进入!");

try{

Thread.sleep(2000);

}catch(Exception e){}

System.out.println(name + "离开!");

}

}

该示例的执行结果为,不同次数下执行结果会有所不同:

1已进入!

1离开!

3已进入!

3离开!

2已进入!

2离开!

在该示例代码中,Toilet类表示卫生间类,Human类模拟人,是该示例中的线程类,TestHuman类是测试类,用于启动线程。在TestHuman中,首先创建一个Toilet类型的对象t,并将该对象传递到后续创建的线程对象中,这样后续的线程对象就使用同一个Toilet对象,该对象就成为了临界资源。下面创建了三个Human类型的线程对象,每个线程具有自己的名称name参数,模拟3个线程,在每个线程对象中,只是调用对象t中的enter方法,模拟进入卫生间的动作,在enter方法中,在进入时输出调用该方法的线程进入,然后延迟2秒,输出该线程离开,然后后续的一个线程进入,直到三个线程都完成enter方法则程序结束。

在该示例中,同一个Toilet类的对象t的enter方法由于具有synchronized修饰符修饰,则在多个线程同时调用该方法时,如果一个线程进入到enter方法内部,则为对象t上锁,直到enter方法结束以后释放对该对象的锁定,通过这种方式实现无论多少个Human类型的线程,对于同一个对象t,任何时候只能有一个线程执行enter方法,这就是解决多线程问题的第一种思路——互斥的解决原理。

JAVA多线程------用1的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. mybatis的sql映射文件—增删改查

    前提:需要的包log4j.jar,mybatis-3.4.1.jar,mysql-connector-java-5.1.37-bin.jar 1.基本类 员工类 package com.hand.my ...

  2. DBUS及常用接口介绍

    [原文]  1. 概述 1.1  DBUS概述     DBUS是一种高级的进程间通信机制.DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要后台进程的角色去分转消息,当一个进程发消息 ...

  3. linux:将job放在后台执行的方法

    本文转自http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 我自己在工作需要远程连到公司的开发机,在开发机上运行程序时,一旦退出终端就会导致运 ...

  4. [Vue]组件——通过$emit为组件自定义事件

    1.在定义组件时调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件enlarge-text: Vue.component('blog-post', { props: ['post' ...

  5. Python中 如何使用telnet 检测端口是否通

    import tn=telnetlib.Telnet(host,port)不报异常则该端口是通的,可结合try进行使用

  6. centos 6 安装python2.7和pip

    由于scrapy1.0的发布,想在Linux上测试,所以安装了centos6.6:但是它的python版本为2.6,很多东西都不支持,所以需要升级为2.7: 首先是在window7上安装虚拟机,然后安 ...

  7. mysql 查看表信息

    desc 表名; 查看表结构信息 show create table 表名; 查询建表详细信息 select COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT from i ...

  8. LR 的基础分析--y-手打

    一.分析Analysis Summary 1.实际参与测试的Vuser为10个 2.总吞吐量(TPS)为208725625bytes 3.平均吞吐量为714814bytes/second 4.总点击数 ...

  9. 输入T,返回TResult的委托

    下面的 委托 兼容输入 参数T,并且 返回值类型为TResult 的 方法(即封装一个具有一个参数并返回TResult 参数指定的类型值的方法) public delegate TResult Fun ...

  10. DJango简单的后台定义登录验证

    第一步创建一个新的项目 APPLICATIONNAME : 表示创建子项目 第二步:找到主项目的url 进行 include 分发式url 简单的说,就是将app里边的url放在这里. 这里也可以找到 ...