线程高级

例题,哲学家用餐:

在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜。

示意图:  设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起、放下两个方法;当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子。

代码示例:

 接着设计哲学家类,这个类继承Thread类,每个哲学家都是一个线程对象。这类有三个属性,用于存放构造器的参数,这个类的构造器要求传递三个参数,分别是哲学家的名字(name)、右边的筷子(right)、左边的筷子(left)。左右筷子的类型都是筷子类型,也就是需要传递两个筷子对象。然后遍写拿起和放下方法,这个两个方法里分别调用着筷子类的拿起、放下方法。在run方法里使用死循环调用拿起和放下方法,并且使用sleep设置一个间隔时间。

代码示例:

  最后编写测试类,测试类里构建五个筷子对象。然后构建五个哲学家对象,分别传递相应的参数。接着将哲学家对象使用start方法启动。

代码示例:

运行结果:

 将这个例题升级为图形化版: 先构建出界面,将JPanel的背景颜色都设置为白色:  筷子类不需要更改,哲学家类则需要添一个JPanel类型的属性用来存放构造器的参数,构造器加多一个JPanel类型的参数。然后在拿起方法里设置JPanel的背景颜色为红色。在放下方法里则设置回白色。

代码示例:

 测试类添加一个线程内部类来调用窗口类的main方法。

代码示例:

运行结果:

 定时器类: Timer定时器类是与线程相关的一个工具类,顾名思义这个类能够到了设置的时间就运行一些代码,这些代码写在run方法里。使用这个类的时候需要继承TimerTask类,使用Timer对象调用schedule方法实现定时。

代码示例:

时间: 2024-08-02 02:50:58

线程高级的相关文章

线程高级操作(二)

之前在线程高级操作中说到了线程的高级操作包括修改线程的属性和进行线程之间的同步操作.线程的同步有两种方式,一种是使用互斥量一种是使用读写锁.上一篇文章说的是互斥量,这篇文章主要介绍的是读写锁. 读写锁与互斥量类似,但是读写锁相对于互斥量来说最大的特点就是并行性高.互斥锁每次只有一个线程可以得到锁进行操作,其他的线程处于阻塞状态.多线程的意义就在于高并发性,但是使用互斥量就会将并行操作编程串行操作,程序的效率会大打折扣. 读写锁的优点是读写锁分为两种,读线程和写线程.读线程只对共享资源进行读操作,

好程序员分享大数据教程之线程高级部分

好程序员分享大数据教程之线程高级部分,首先讲一下线程的生命周期 对于一个线程, 在被创建后, 不是立即就进入到了运行状态, 也不是一直处于运行状态, 在线程的声明周期中, 一个线程会在多种状态之间进行切换 new : 新生状态, 线程被实例化, 但是还没有开始执行(start) runnable: 就绪状态, 已经执行过start, 线程已经启动了, 只是没有抢到CPU时间片 running: 运行状态, 抢到了CPU时间片 blocked: 阻塞状态, 线程执行的过程中, 遇到一些特殊情况,

(一)juc线程高级特性

1. volatile 关键字与内存可见性 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情. 定义线程类ThreadDemo,功能是将boolean型变量flag的值修改 class ThreadDemo implements Ru

线程高级.md

例题,哲学家用餐: 在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜. 示意图:  设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起.放下两个方法:当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程,以此循环,轮流使用筷子. 代码示例:  接着设计哲学家类,

[2014-9-15]异步委托线程高级

昨天悲剧,帮别人调代码,愣没调出来.还没时间写博文了. 忧桑... 昨天的今天写吧,今天也没学,就上了一天的课. 1 首先窗口间数据进行传递.也就是父窗口与子窗口数据进行传递. 用委托实现 ①,在同一命名控件下定义委托. ②,在子窗口创建委托实例. ③,在父窗口创建子窗口对象,传递委托方法. public delegate void SetString(string str);    public partial class Form1 : Form    {        public For

JAVA-多线程(高级)

阻塞队列: 1)BlockingQueue该接口提供了: add()/remove() 如果当队列没有数据,从队列中取数据;或者队列中数据已满, 向队列中添加数据;则会抛出异常. put()/take() 如果当队列没有数据,从队列中取数据;或者队列中数据已满, 向队列中添加数据;则会形成阻塞. offer()/poll() 会给调用者返回特殊的值,开发者可以通过这些值做相应的处理 同时还提供了超时版本. 2)接口实现 ArrayBlockingQueue>由数组实现的有界队列,默认情况下没有指

线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯

1.Lock相关知识介绍 好比我同时种了几块地的麦子,然后就等待收割.收割时,则是哪块先熟了,先收割哪块. 下面举一个面试题的例子来引出Lock缓存读写锁的案例,一个load()和get()方法返回值为空时的情况:load()的返回值是一个代理对象,而get()却是一个实实在在的对象:所以当返回对象为空是,get()返回null,load()返回一个异常对象:具体分析如下: 一个读写锁的缓存库案例:用上面那道面试题分析则很好理解: 线程阻塞问题:运用多个Condition对象解决 2. Lock

线程高级应用-心得2-同步锁讲解及面试题案例分析

1.引入同步锁 2.同步锁案例分析 package com.itcast.family; /* * 传统线程的使用及注意事项 */ public class TraditionalThread { public static void main(String[] args) { //一.线程1:直接new一个thread子类,让子类run方法覆盖父类的run() Thread thread1 = new Thread(){ @Override public void run() { while(

线程高级应用-心得4-java5线程并发库介绍,及新技术案例分析

1.  java5线程并发库新知识介绍 2.线程并发库案例分析 1 package com.itcast.family; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 import java.util.concurrent.TimeUnit; 6 7 public class ThreadPoolTest { 8 9 /** 10 * @param args