java多线程中测试同步的小程序

时间:2022-07-03 16:14:13 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
java多线程中测试同步的小程序

在学习编程的过程中,我觉得不止要获得课本的知

识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;

这是我做的一个很简单的多线程同步程序,目的是为了测试多线程编程下如何使用同步(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("------系统默认无参数Dateparse------"); 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; }

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 EventKey implements IntGenerator{ private int i=0;

synchronized public int next(){


i++; i++; try{

TimeUnit.MILLISECONDS.sleep(1000); }catch(InterruptedException e){ System.out.println(e); }

return i; } }

interface IntGenerator{ public int next(); }

现实当中将对共享资源的共有操作方法放在接口或抽象类,这样在通过继承抽象类或实现这个接口可以得到更好的效果!这样代码也更清晰,更有层次感! 疯狂Java培训的课程采用针对性培养,全面提升学员就业能力,重点加强训练职业素质。老师辛勤的讲解,让学员充分感受Java的魅力,充分激发每个学员对于编程的热爱,让学员在半年的时间内掌握8-10万的代码量,成为真正的技术高手,疯狂Java采用企业全真模拟开发训练,迅速积累项目经验。让学员迅速获得其他人需要花费两年才能获得的工作技能,无忧就业!


本文来源:https://www.wddqw.com/doc/e5ce3632482fb4daa58d4ba0.html