java 线程二

/*
多线程死锁问题。

*/
class Tacket implements Runnable //extends Thread
{
	private static int sum=200;//sum是共享数据,放在堆内存中,所有线程访问这一个共享数据。在一个线程运行完之后,共享数据要被同步修改。
	Object obj=new Object();
	boolean flag=true;
	public void run()
	{
		if(flag)
		{
			while(true)
			{
				synchronized(obj)
				{
					show();
				}
			}
		}
		else
			while(true)
				show();
	}
	public synchronized void show()
	{
		synchronized(obj)   //同步代码块,存放需要被同步的代码。
		{
			if(sum>0)   //操作共享数据
			{
				try
				{
					Thread.sleep(10);
				}
				catch (InterruptedException e)
				{
				}
				System.out.println(Thread.currentThread().getName()+"run"+sum--);  //操作共享数据
			}
		}
	}
}

class  TacketDemo2
{
	public static void main(String[] args)
	{
		Tacket t=new Tacket();   //只创建了一个Ticket对象,所有线程共享此对象的数据,包括总票数sum
		Thread t1=new Thread(t);//将Runnable接口的子类对象作为参数传递给Thread类的构造函数,目的是线程运行子类对象中的run方法。
		Thread t2=new Thread(t);
		t1.start();
		try{Thread.sleep(10);}catch(InterruptedException e){}
		t.flag=false;
		t2.start();

		//Thread t3=new Thread(t);
		//Thread t4=new Thread(t);
		//t3.start();
		//t4.start();

		//t1.start();//出现异常,因为线程t1已经被开启,无需再被开启。
		System.out.println("Hello World!");
	}
}

时间: 2024-08-04 16:27:57

java 线程二的相关文章

Java线程(二):线程同步synchronized和volatile

上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程共享的,一个线程改变了其成员变量num值,下一个线程正巧读到了修改后的num,所以会递增输出. 要说明线程同步问题首先要说明Java线程的两个特性,可见性和有序性.多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现.拿上篇博文中的例子来说明,在多个线程之间共享了Count类的

java线程(二) - 线程安全性

前言: 要编写线程安全的代码,其核心在于要对状态访问的操作进行管理,特别是对共享的和可变的状态的访问. 当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误,有三种方式可以修复这个问题: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 线程安全性的定义: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 那

每日5道面试题八(java线程二)

Java中Runnable和Callable有什么不同? Runnable和Callable都代表那些要在不同的线程中执行的任务.Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的.它们的主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能.Callable可以返回装载有计算结果的Future对象. Java中CyclicBarrier 和 CountDownLatch有什么不同? CyclicBarr

Java线程专栏文章汇总(转)

原文:http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程(二):线程同步synchronized和volatile Java线程(三):线程协作-生产者/消费者问题 Java线程(四):线程中断.线程让步.线程睡眠.线程合并 Java线程(五):Timer和TimerTask JDK5.0之后并发包        Java线程(六):线程池 Java线程

Java线程专栏文章汇总

JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程(二):线程同步synchronized和volatile Java线程(三):线程协作-生产者/消费者问题 Java线程(四):线程中断.线程让步.线程睡眠.线程合并 Java线程(五):Timer和TimerTask JDK5.0之后并发包        Java线程(六):线程池 Java线程(七):Callable和Future Java线程(八):锁对象Lock-同步问题更完美的处理方式 Java

Java线程详解(二)

Java线程:新特征-线程池 线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源. 在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的. Java通过Executor

Java线程池使用和分析(二) - execute()原理

相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的方法,JDK注释中的描述是“在未来的某一时刻执行命令command”,即向线程池中提交任务,在未来某个时刻执行,提交的任务必须实现Runnable接口,该提交方式不能获取返回值.下面是对execute()方法内部原理的分析,分析前先简单介绍线程池有哪些状态,在一系列执行过程中涉及线程池状态相关的判断

Java当中的线程(二)

1. 实现线程的第二种方法 2. 控制线程的常用方法 1. 第一种方法是使用继承, 但Java只能使用一次继承, 因此下面这种方法使用的更多 1 class RunnableImpl implements Runnable{ 2 public void run(){ 3 for(int i = 0; i< 100; i++){ 4 System.out.println("Runnable--->" + i); 5 } 6 } 7 } 1 class Test{ 2 publ

java基础学习总结——线程(二)

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——线程(二) 一.线程的优先级别 线程优先级别的使用范例: 1 package cn.galc.test; 2 3 public class TestThread6 { 4 public static void main(String args[]) { 5 MyThread4 t4 = new MyThread4(); 6 MyThread5 t5 = new MyThread5(); 7 Thread t1