马士兵J2SE-第九章-多线程机制-举例、线程同步之锁

 

package com.zzk.test;

//同样一个线程类可以起两个线程
public class Test {
	public static void main(String[] args) {
		Runner r=new Runner();
		Thread t1=new Thread(r);
		Thread t2=new Thread(r);
		t1.start();
		t2.start();
	}
}

class Runner implements Runnable {
	public void run() {
		for(int i=0;i<30;i++) {
			System.out.println("No. "+i);
		}
	}
}

 

 

package com.zzk.test;

//sleep方法
public class Test {
	public static void main(String[] args) {
		Runner r=new Runner();
		Thread t=new Thread(r);
		t.start();
	}
}

class Runner implements Runnable {
	public void run() {
		for(int i=0;i<30;i++) {
			if(i%10==0 && i!=0) {
				try {
					Thread.sleep(2000);
				}catch(InterruptedException e) {}
			}

			System.out.println("No. "+i);
		}
	}
}
package com.zzk.test;

//正确停止一个线程
public class Test {
	public static void main(String[] args) {
		Runner r=new Runner();
		Thread t=new Thread(r);
		t.start();

		for(int i=0;i<100000;i++) {
			if(i%10000==0&i>0)
				System.out.println("in thread main i="+i);
		}
		System.out.println("Thread main is over");
		r.shutDown();

	}
}

class Runner implements Runnable {
	private boolean flag=true;

	public void run() {
		int i=0;
		while (flag==true) {
			System.out.print(" "+i++);
		}
	}

	public void shutDown() {
		flag=false;
	}
}
package com.zzk.test;

public class Test {
	public static void main(String[] args) {
		Runner r=new Runner();
		Thread t=new Thread(r);
		t.start();

		try {
			t.join();
		}catch(InterruptedException e) {

		}

		for(int i=0;i<50;i++) {
			System.out.println("主线程:"+i);
		}
	}
}

class Runner implements Runnable {
	public void run() {
		for(int i=0;i<50;i++) {
			System.out.println("SubThread: "+i);
		}
	}
}

 

package com.zzk.test;

public class Test {
	public static void main(String[] args) {
		Thread t=new Runner();
		t.start();

		for(int i=0;i<50;i++) {
			System.out.println("MainThread: "+i);
		}
	}
}

class Runner extends Thread {
	public void run() {
		System.out.println(Thread.currentThread().isAlive());
		for(int i=0;i<50;i++) {
			System.out.println("SubThread: "+i);
		}
	}
}

 

package com.zzk.test;

public class Test implements Runnable {
	Timer timer=new Timer();
	public static void main(String[] args) {
		Test test=new  Test();
		Thread t1=new Thread(test);
		Thread t2=new Thread(test);
		t1.setName("t1");
		t2.setName("t2");
		t1.start();
		t2.start();
	}

	public void run() {
		timer.add(Thread.currentThread().getName());
	}

}

//class Timer {
//	private static int num=0;
//
//	public void add(String name) {
//		synchronized(this) {//锁定某一个东西
//			num++;
//			try {Thread.sleep(1);}
//			catch(InterruptedException e) {}
//			System.out.println(name+",你是第"+num+"个使用timer的线程");
//		}
//	}
//}

class Timer {
	private static int num=0;

	public synchronized void add(String name) {//锁定当前对象

			num++;
			try {Thread.sleep(1);}
			catch(InterruptedException e) {}
			System.out.println(name+",你是第"+num+"个使用timer的线程");

	}
}

输出:

t1,你是第1个使用timer的线程
t2,你是第2个使用timer的线程

 

 

 

 

 

 

 

 

时间: 2024-09-13 14:07:09

马士兵J2SE-第九章-多线程机制-举例、线程同步之锁的相关文章

马士兵J2SE-第九章-多线程机制-sleep、join、yield、线程优先级

sleep: package com.zzk.test; import java.util.*; public class Test{ public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); try { Thread.sleep(10000);//10秒结束 } catch(InterruptedException e) { } thread.interrupt(); }

马士兵 J2SE 第11章 GUI编程 GUI初步和布局管理器

/* 范例名称:Frame 应用举例 * 源文件名称:TestFrame.java * 要 点:Frame组件的创建及显示设置 */ import java.awt.*; public class TestFrame { public static void main( String args[]) { Frame f = new Frame("My First Test"); f.setLocation(300, 300); f.setSize( 170,100); f.setBac

马士兵J2SE-第六章-常用类-基本数据类型包装类、Maths类、File类

基本数据类型包装类 public class test { public static void main(String[] args) { Integer i=new Integer(100); Double d=new Double("123.456"); int j=i.intValue()+d.intValue(); float f=i.floatValue()+d.floatValue(); System.out.println(j); System.out.println(

马士兵J2SE-第三章-面向对象-基础及重载

面向对象: //面向对象的方法写一段程序,要求能够手动修改年月日的信息 class Date { private int day; private int month; private int year; public Date (int d, int m, int y) { day = d; month = m; year = y; } public void setDay(int d) { day=d; } public void setMonth(int m) { month = m; }

c#.net多线程编程教学——线程同步_C#教程

随着对多线程学习的深入,你可能觉得需要了解一些有关线程共享资源的问题. .NET framework提供了很多的类和数据类型来控制对共享资源的访问. 考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用System.Threading.Interlocked类完成这样的任务,它提供了原子的,非模块化的整数更新操作. 还有你可以使用System.Threading.Monitor类锁定对象的方法的一段代码,使其暂时不能被别的线程访问. System

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下)

转自 http://www.cnblogs.com/freshman0216/archive/2008/08/07/1256919.html    前两篇简单介绍了线程同步lock,Monitor,同步事件EventWaitHandler,互斥体Mutex的基本用法,在此基础上,我们对它们用法进行比较,并给出什么时候需要锁什么时候不需要的几点建议.最后,介绍几个FCL中线程安全的类,集合类的锁定方式等,做为对线程同步系列的完善和补充.       1.几种同步方法的区别       lock和M

银行取款[多线程]{未进行线程同步}(junit不适合多线程并发单元测试)

        由于计算机多任务.多进程.多线程的支持,使得计算机资源的服务效率提高,服务器对请求的也使用线程来相应,所有,代码中涉及到同时对共享数据的操作,将在 多线程环境中操作数据,导致数据安全问题.      经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.      如果要保证多线程下数据安全,就要实现线程同步(例如:一间小厕所,就得有一个锁,保证同一时间为一个人服务).其他文章讲: 此处用多线程实现,同时取款的模拟实现,未进行线程同步

多线程-Delphi的线程同步的Mutex是引用计数的吗?引用计数的作用是什么?

问题描述 Delphi的线程同步的Mutex是引用计数的吗?引用计数的作用是什么? Delphi的线程同步的Mutex是引用计数的吗?引用计数的作用是什么? 解决方案 Mutex是互斥量,并且Mutex是可以跨进程的,所以开销比较大,它是操作系统封装的.它的用处,比如防止程序多开,进程同步等等. 线程同步用信号量临界区就可以了. 引用计数有不同的含义,通常我们说是指com对象的垃圾回收机制.com对象每创建一个引用指向它,引用计数+1,不再引用就-1,如果引用计数为0,代表com对象可以垃圾回收

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/1252253.html   本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开 始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释.让我们来看看这几个类的关系图:         1.lock关键字       lock是C#关键词,它将语句块