【java多线程中测试同步的小程序】
2013-08-17 09:07
267 查看
这是我做的一个很简单的多线程同步程序,目的是为了测试多线程编程下如何使用同步(synchronized)防止产生竞争共享资源的错误状态,从中得到的心得是:一定要将你所共享的变量封装在一个类中,将所有有关该变量的操作方法都尽可能地封装在包含该变量的类中,并将所有有关读取修改该共享变量的方法都设为同步方法,只有这样才是安全的,并且该变量必须是private类型,主要是为了防止其他对象无意读取到该变量而使该变量的同步形同虚设!因为你可以不通过同步方法直接对该共享变量进行操作!不说了,下面来看代码吧!我还在代码中加了一个计时器类Timer类,这个类可以产生一个后台线程,专门用于计时到指定时间或延时一定时间就去执行TimeTask线程对象任务。
package xinyu.shangrao.demo.fucking;
import java.util.Date;
import java.text.ParseException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
public class ThreadDemoNew {
public static void main(String[] args) throws ParseException {
long counter;
/* Date date = null;
String s = "2013-05-29 上午08:26 ";
SimpleDateFormat sdf = new SimpleDateFormat();
date = sdf.parse(s);
System.out.println("------系统默认无参数Date的parse------");
System.out.println(" " +date.getTime() );
counter=date.getTime();
System.out.println(" " + date ); */
Date tim=new Date();
counter=tim.getTime();
tim.setTime(counter+9000);
new Timer().schedule(new TimerTask(){ //到指定时间就去执行这个指定任务,这里是退出操作
public void run(){
System.out.println("时间到:");
System.exit(0);
}
}, tim );
EventKey ke=new EventKey();
Thread1 demo1=new Thread1(ke) ;
Thread2 demo2=new Thread2(ke) ;
demo1.start();
demo2.start();
}
}
class Thread1 extends Thread{
private EventKey ek;
private int ko;
public Thread1(EventKey e){
ek=e;
}
public void run(){
synchronized(this){
while(true){
ko=ek.next();
System.out.println(Thread.currentThread()+"ko:"+ko);
if(ko % 2 !=0 ){
System.out.println("输出的是奇数");
System.exit(0);
}
}}}
}
class Thread2 extends Thread{
private EventKey ek;
private int ko;
public Thread2(EventKey e){
ek=e;
}
更多精彩教程请关注:XP系统下载之家
package xinyu.shangrao.demo.fucking;
import java.util.Date;
import java.text.ParseException;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
public class ThreadDemoNew {
public static void main(String[] args) throws ParseException {
long counter;
/* Date date = null;
String s = "2013-05-29 上午08:26 ";
SimpleDateFormat sdf = new SimpleDateFormat();
date = sdf.parse(s);
System.out.println("------系统默认无参数Date的parse------");
System.out.println(" " +date.getTime() );
counter=date.getTime();
System.out.println(" " + date ); */
Date tim=new Date();
counter=tim.getTime();
tim.setTime(counter+9000);
new Timer().schedule(new TimerTask(){ //到指定时间就去执行这个指定任务,这里是退出操作
public void run(){
System.out.println("时间到:");
System.exit(0);
}
}, tim );
EventKey ke=new EventKey();
Thread1 demo1=new Thread1(ke) ;
Thread2 demo2=new Thread2(ke) ;
demo1.start();
demo2.start();
}
}
class Thread1 extends Thread{
private EventKey ek;
private int ko;
public Thread1(EventKey e){
ek=e;
}
public void run(){
synchronized(this){
while(true){
ko=ek.next();
System.out.println(Thread.currentThread()+"ko:"+ko);
if(ko % 2 !=0 ){
System.out.println("输出的是奇数");
System.exit(0);
}
}}}
}
class Thread2 extends Thread{
private EventKey ek;
private int ko;
public Thread2(EventKey e){
ek=e;
}
更多精彩教程请关注:XP系统下载之家
相关文章推荐
- Java程序、进程和线程-Java对多线程的支持-Java线程的同步--2011年09月05日
- Java的多线程之同步篇三:同步阻塞、监视器、volatile、final、原子性、线程局部变量、锁测试与超时、读写锁
- 没有任何同步的Java多线程程序(高性能)
- java多线程(七) 之 同步容器类
- java多线程访问同一变量及简单同步问题(待后续整理)
- 多线程并发库高级应用 之 使用java5中同步技术的3个面试题
- Java 多线程(五) 多线程的同步
- java多线程有几种实现方法?线程之间如何同步
- 用java编写多线程ftp断点下载文件程序
- Java多线程并发编程之构建自定义同步工具
- Java程序的单元测试-分析并获取测试用例
- hadoop-2.5.2本地测试环境下(利用java多线程模拟),提交MapReduce任务时出现的错误及解决办法
- (14)多线程与并发库之java5同步集合类的应用【包含jdk1.5新特性 ConcurrentHashMap】
- 比较Jmeter、Grinder和JAVA多线程本身压力测试所带来的性能开销
- 【Java多线程】多线程的线程安全及同步(synchronized)用法
- java多线程与多核心测试
- Java多线程(3) 线程的同步-上
- Zookeeper的集群配置和Java测试程序
- java多线程程序性能调优 优化过程
- Java多线程知识点总结——进阶篇(一)之卖票程序