---------------------- android培训java培训、期待与您交流! ----------------------




java同步机制(线程)




//java同步机制
/*在java中实现同步有两种方式,即同步块和同步方法。同步方法的使用很简单只需在需要同步的
方法声明的时候加上synchronized关键字即可
同步方法方法的格式如下:
synchronized  方法声明
{
 //方法体
}
同步块的格式如下:
synchronized(资源对象)
{
 //需要进行同步的方法
}*/
//下面是同步方法的示例
//Printer类用来模拟打印机,它可以获得信息并把它打印出来
class Printer
{
  //打印方法
  synchronized void printScore(String name,int score1,int score2,int score3)
  {
 System.out.println(name+"的成绩: ");
 System.out.print(name+"英语: ");
 System.out.println(score1);
 //为了使程序运行结果明显,在打印的过程中让打印工作休眠一段时间
 try
 {
Thread.sleep(1000);
 }
 catch(InterruptedException e)
 {
e.printStackTrace();
 }
 System.out.print(name+"数学: ");
 System.out.println(score2);
 System.out.print(name+"语文: ");
 System.out.println(score3);
  }
}

//教师类,每个教师都有自己的线程并且共用一个打印机
class Teacher implements Runnable
{
 Printer ps=null; //打印机
 String name=null; //名字
 Thread t;     //线程
 int score1=0;  //成绩
 int score2=0;
 int score3=0;

 //教师类构造函数
 public Teacher(Printer printer,String nm, int s1,int s2,int s3)
 {
ps=printer;
name=nm;
t=new Thread(this);
score1=s1;
score2=s2;
score3=s3;
 }
 //教师调用打印机
 public void run()
 {
ps.printScore(name,score1,score2,score3);
 }
}
public class SynchDemo
{
 public static void main(String[] argv)
 {
//创建一个打印机对象
Printer ps=new Printer();
//创建三个教师实例
Teacher t1=new Teacher(ps,"lancy",87,76,90);
Teacher t2=new Teacher(ps,"macula",97,86,70);
Teacher t3=new Teacher(ps,"herbert",67,86,97);
//启动打印工作
t1.t.start();
t2.t.start();
t3.t.start();
 }
}


//下面是同步块的示例
class Printer1
{
  //打印方法
  synchronized void printScore(String name,int score1,int score2,int score3)
  {
 System.out.println(name+"的成绩: ");
 System.out.print(name+"英语: ");
 System.out.println(score1);
 //为了使程序运行结果明显,在打印的过程中让打印工作休眠一段时间
 try
 {
Thread.sleep(1000);
 }
 catch(InterruptedException e)
 {
e.printStackTrace();
 }
 System.out.print(name+"数学: ");
 System.out.println(score2);
 System.out.print(name+"语文: ");
 System.out.println(score3);
  }
}

//教师类,每个教师都有自己的线程并且共用一个打印机
class Teacher1 implements Runnable
{
 Printer1 ps=null; //打印机
 String name=null; //名字
 Thread t;     //线程
 int score1=0;  //成绩
 int score2=0;
 int score3=0;

 //教师类构造函数
 public Teacher1(Printer1 printer,String nm, int s1,int s2,int s3)
 {
ps=printer;
name=nm;
t=new Thread(this);
score1=s1;
score2=s2;
score3=s3;
 }
 //教师调用打印机
 public void run()
 {
synchronized(ps) //锁定ps对象,让其单线程操作
{
 ps.printScore(name,score1,score2,score3);
}
 }
}
public class SynchDemo1
{
 public static void main(String[] argv)
 {
//创建一个打印机对象
Printer1 ps=new Printer1();
//创建三个教师实例
Teacher1 t1=new Teacher1(ps,"lancy",87,76,90);
Teacher1 t2=new Teacher1(ps,"macula",97,86,70);
Teacher1 t3=new Teacher1(ps,"herbert",67,86,97);
//启动打印工作
t1.t.start();
t2.t.start();
t3.t.start();
 }
}


/*java的同步是通过锁的机制来实现的,当进程进入同步方法的时候该线程
将会获得同步方法所属对象的锁,一旦获得对象锁,则其他线程不能再执行
被锁对象的其他任何同步方法,只有在同步方法执行完毕后释放锁之后才能执行。
下面程序说明了这一点*/
class Source
{
 //定义同步方法method1
 synchronized void method1()
 {
System.out.println("进入方法method1,获得锁");
try
{
 Thread.sleep(1000);  //线程休眠
}
catch(InterruptedException e)
{
 e.printStackTrace();
}
System.out.println("method1执行完毕,释放锁");
 }
//定义同步方法method2
synchronized void method2()
{
 System.out.println("进入方法method2,获得锁");
 try
 {
Thread.sleep(1000);  //线程休眠
 }
 catch(InterruptedException e)
 {
e.printStackTrace();
 }
 System.out.println("method2执行完毕,释放锁");
  }
}

//定义线程类
class MyThread implements Runnable
{
 String name;   //通过name来判断调用哪个方法
 Source s=null;
 MyThread(Source s1,String name)
 {
s=s1;
this.name=name;
 }

 public void run()
 {
if("method1".equals(name))
 s.method1();
else
{
 System.out.println("Thread2 启动,准备调用method2");
 s.method2();
}
 }
}
public class SynchMethodDemo
{
 public static void main(String[] argv)
 {
Source s=new Source();   //创建一个资源对象
//创建两个实现Runable接口的对象
MyThread mt1=new MyThread(s,"method1");
MyThread mt2=new MyThread(s,"method2");

//创建两个线程
Thread t1=new Thread(mt1);
Thread t2=new Thread(mt2);
//启动线程
t1.start();
t2.start();
 }
}


---------------------- android培训java培训、期待与您交流! ----------------------