线程笔记一:java线程经典题目:轮流打印

题目:构建四个线程,线程A将变量100加1,B减1,c加1,D减1,要按照A->B->C->D的顺序执行,最终数字还为100.使用多线程

代码:

PrintLetter.java
import java.lang.Thread;
class MyThread implements Runnable{

	//给线程分配三个对象
	private Object pre;
	private Object self;
	private Num num;

	public MyThread(Object pre,Object self,Num num){
		this.pre=pre;
		this.self=self;
		this.num=num;
	}

	public void run(){
		for(int i=0;i<10;i++){
			synchronized(pre){
				synchronized(self){
					synchronized(num){
						self.done(num,Thread.currentThread().getName());
						self.notify();//唤醒其他线程释放对象锁
					}
				}
				//否则或者运行完成后释放前一个对象锁
				try{
					pre.wait();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
}
//数字对象
class Num{
	public int num=100;
	public void add(){
		this.num++;
	}
	public void resuce(){
		this.num--;
	}
	public int get(){
		return this.num;
	}
}

class Object{
	boolean done;//表示加或减
	public Object(boolean done){
		this.done=done;
	}
	public void done(Num num,String name){
		if(this.done){
			num.add();
			System.out.println(""+name+" add---- one,Then num="+num.get());
		}else{
			num.resuce();
			System.out.println(""+name+" reduce one,Then num="+num.get());
		}
	}
}

public class PrintLetter{
	public static void main(String args[]){
		//定义四个对象
		Object first=new Object(true);
		Object two=new Object(false);
		Object three=new Object(true);
		Object four=new Object(false);
		Num num=new Num();
		MyThread mythread1=new MyThread(four,first,num);
		MyThread mythread2=new MyThread(first,two,num);
		MyThread mythread3=new MyThread(two,three,num);
		MyThread mythread4=new MyThread(three,four,num);
		new Thread(mythread1).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){

		}
		new Thread(mythread2).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){

		}
		new Thread(mythread3).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){

		}
		new Thread(mythread4).start();
		try{
			Thread.sleep(100);
		}catch(Exception e){

		}
	}
}

结果:

过程解析:

/*
	四把锁 a b c d
	线程1  临界区要获得锁d a
	线程2  临界区要获得锁a b
	线程3  临界区要获得锁b c
	线程4  临界区要获得锁c d

	执行线程1的时 由于线程1 获得了锁a,所以线程2会等待线程1释放锁a,线程2得到锁b
	线程3会等待线程2是否锁b,线程4等待锁c和d.

	线程1执行完临界区后,调用a.notify,释放自身锁,此时线程2被唤醒,开始执行,连锁反应
	线程3线程4会的到顺序执行。 此外线程1调用d.wait等待其他线程唤醒,当执行完线程4的时候
	调用d.notify 又会唤醒线程1. 此过程反复,直到所有线程执行完毕。线程1 2 3 4会得到顺序执行

	执行1唤醒2   执行2唤醒3   执行3唤醒4   执行4唤醒1:
	1-------------->2-------->3------------>4
	^                                       |
	|---------------------------------------|

*/
时间: 2024-11-08 17:14:34

线程笔记一:java线程经典题目:轮流打印的相关文章

【java线程系列】java线程系列之java线程池详解

一线程池的概念及为何需要线程池: 我们知道当我们自己创建一个线程时如果该线程执行完任务后就进入死亡状态,这样如果我们需要在次使用一个线程时得重新创建一个线程,但是线程的创建是要付出一定的代价的,如果在我们的程序中需要频繁使用线程,且每个线程执行的时间很短,短到几乎小于线程创建及销毁的时间那么代价将会更大,如:服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的.显然如果频繁的创建销毁线程效率将非常低. 那么我们能否让一个线程可以复用,即当一个线程执行完后不销毁该线程,而

学习笔记:java线程安全

上周的支付宝电话面试中问了我一个线程安全的问题,就是有一个类,他的方法A是加了synchronized关键字的,然后分别创建这个类的两个实例,请问,当多个线程同时访问这两个实例中的方法A时synchronized会起作用吗? 当时我的回答是会起作用,今天觉得这个问题要好好研究一下,于是就写了代码做了一下测试,发现自己答错了,这或许是我面试失败的原因之一吧.代码贴出来: class Thread2 extends Thread{ public void run() { MyObj obj = ne

JAVA语法——经典题目09

21.Iterator和Listlterator的区别是什么? 下面列出了他们的区别: Iterator可用来比那里Set和List集合,但是ListIterator只能用来遍历List Iterator对集合只能是前向遍历,ListIteratorj既可以前向也可以后向. ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等. 22.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么? 快速失

JAVA语法——经典题目05

09.接口和抽象类的区别是什么? JAVA提供和支持创建抽象类和接口.它们的实现由共同点,不同的在于: 1.接口中所有的方法隐含的都是抽象的.而抽象类则可以同时包含抽象和非抽象的方法. 2.类可以实现很多个接口,但是只能集成一个抽象类可以不识闲抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明是抽象的.抽象类可以在提供接口方法实现的情况下实现接口. 3.JAVA接口中声明的变量默认都是final的.抽象类可以包含非final的变量. 4.JAVA接口中的成员函数默认是public的.

java线程池笔记

java线程池是预先创建线程的一种技术,线程池在还没有线程到来之前创建一个数量的线程,放在空闲的队列中,然后对这些资源进行复用,减少频繁的创建和销毁对象, 1.jdk1.5以上提供了现成的线程池 2.java线程池的顶级接口是Executor,是一个执行线程的工具 3.线程池接口是ExecutorService

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

java线程详解

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

Java线程知识拾遗

知识回顾 进程与线程是常常被提到的两个概念.进程拥有独立的代码段.数据空间,线程共享代码段和数据空间,但有独立的栈空间.线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程.多线程和多进程都可以实现并发处理,如 nginx 使用多进程方式.tomcat 使用多线程方式.Apache 支持混合使用.在 C/C++ 等语言中可以同时使用多进程和多线程,而在 Java 中只能使用多线程. 在 Java 中,创建线程的唯一方式是创建 Thread 类的实例,调用实例的 start() 方法启动

Java线程详解----借鉴

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

Java线程:概念与使用

Java线程大总结 原文章地址:一篇很老的专栏,但是现在看起来也感觉深受启发,知识点很多,很多线程特点我没有看,尴尬.但是还是整理了一下排版,转载一下. 操作系统中线程和进程的概念 在现代操作系统中,进程支持多线程.进程是资源管理的最小单元:线程是程序执行的最小单元. 为了实现程序的并发执行引入了进程的概念(程序段.数据段.PCB三部分).每个进程都有自己独立的一块内存空间,进程是程序的一个执行过程,进程之间可以并发执行. 线程是指进程中的一个执行流程,是CPU调度和分派的基本单位,它是比进程更