题目:请编写一个多线程程序,实现两个线程,其中一个线程完成对某个对象的int成员变量的增加操作,即每次加1,另一个线程完成对该对象的成员变量的减操作,即每次减1,同时要保证该变量的值不会小于0,不会大于1,该变量的初始值为0.
即要求输出结果是0101010101010101这样的形式
关于wait,notify,notifyAll以及sleep方法的关系(重点)
1 如果一个线程调用了某个对象的wait方法,那么该线程首先必须要有该对象的锁(换句话说,一个线程调用了某个对象的wait方法,你们该wait方法必须要在synchronized中)
2 如果一个线程调用了某个对象的wait方法,那么该线程就会释放该对象的锁
3 在java对象中,有两种池(锁池,等待池)
4 如果一个线程调用了某个对象的wait方法,那么该线程进入该对象的等待池中(释放锁),如果未来的某一时刻,另外一个线程调用了相同的对象的notify或notifyall方法,那么在该等待池中的等待的线程就会起来进入该对象的锁池中,去等待获得该对象的锁,如果获得锁成功后,那么该线程将继续沿着wait方法之后的路径去执行。
5 sleep(long time),如果一个线程调用了sleep方法睡眠,那么在睡眠的同时,它不会失去对象的锁的拥有权。
关于synchronized关键字的作用
1 在某个对象的所有synchronized方法中,在某一时刻,只能有一个唯一的一个线程去访问这些synchronized方法
2 如果一个方法是synchronized方法,那么该synchronized关键字表示给当前对象上锁(即this)
3 如果一个synchronized方法是静态的(static的),那么该synchronized关键字表示给当前对象所对应的Class对象上锁。(每个类,不管生成多少对象,其Class对象只有一个)
代码示例一、
java 代码
- package com.test.thread;
-
- public class Sample {
- private int number;
-
-
- public synchronized void increate()
- {
- while(number>0)
- {
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- number++;
- System.out.println(number);
- notify();
- }
-
-
- public synchronized void decreate()
- {
- while(number==0)
- {
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- number--;
- System.out.println(number);
- notify();
- }
-
-
- }
java 代码
- package com.test.thread;
-
- public class IncreateThread extends Thread {
-
- private Sample sample;
-
- public IncreateThread(Sample sample)
- {
- this.sample = sample;
- }
-
-
- @Override
- public void run() {
-
- for(int i=0;i<5;i++)
- {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- sample.increate();
- }
-
- }
-
- }
java 代码
- package com.test.thread;
-
- public class DecreateThread extends Thread {
-
- private Sample sample;
-
- public DecreateThread(Sample sample)
- {
- this.sample = sample;
- }
-
-
- @Override
- public void run() {
-
- for(int i=0;i<5;i++)
- {
- try {
- sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- sample.decreate();
-
- }
-
-
- }
-
- }
java 代码
- package com.test.thread;
-
- public class TestThread {
-
-
-
-
- public static void main(String[] args) {
-
- Sample sample = new Sample();
-
- Thread thread1 = new IncreateThread(sample);
- Thread thread2 = new DecreateThread(sample);
-
- Thread thread3 = new IncreateThread(sample);
- Thread thread4 = new DecreateThread(sample);
-
- thread1.start();
- thread2.start();
- thread3.start();
- thread4.start();
-
- }
-
- }
分享到:
相关推荐
多线程的专用书籍这是很好的,在网上找到的,应该还是可以,多好
一个关于多线程的小例子,都是自己实战中总结的些东西,按照文档里说的来,新手可以写出一个完整的多线程功能。
关于多线程的个人总结,包括概念理解、创建线程、线程同步安全、各类锁、线程状态、并行并发、异步同步等
关于多线程一个小程序 来源于侯捷的深入浅出MFC 不错的啊 谢谢大家下载
关于多线程的C#打字游戏,初学者可下载看一下,无需资源分
书全名是 C#并发编程经典实例 ,是 C#关于多线程开发 的 经典, 所需积分最少
统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。 本文我们将介绍在Linux 下编写多进程和多线程程序的一些初步知识。 1 引言 对于没有接触过 Unix/Linux 操作系统的人来说,fork ...
关于多线程的入门知识讲解,如什么是多线程,怎样编写一个多线程程序,后台线程,线程组,线程的生命周期,多线程的同步处理等等等等
关于多线程的界面操作 主讲了UI交互 多线程卡UI问题
第一章 关于多线程编程 第二章 线程管理
这是一个关于多线程的实例,通过本例可以了解多线程的运行情况!
iOS多线程编程指南(一)关于多线程编程 - 51CTO.COM1
一个关于多线程的例子,包含了progress控件的开始,暂停,回复等
关于多线程的几个小问题,和常用的几个小例子。
整理的关于多线程的一些资料,互斥,同步等,以及面试题,代码等常见问题。
多线程程序的编写,多线程应用中容易出现的问题。互斥对象的讲解,如何采用互斥对象来实现多线程的同步。如何利用命名互斥对象保证应用程序只有一个实例运行。应用多线程编写网络聊天室程序。
一款关于多线程的大游戏,如果是是初学者的话,可以来看一下
最近在修改一个别人做的设备监控程序,用到delphi的多线程,收集了一点资料,希望也能方便大家
两个很精典的IOS中使用多线程的代码。有关NSThread类的使用一看这两个例子马上就能理解了。
有关多线程的小程序,以及怎样创建多线程和异常处理