---------------------- 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培训、期待与您交流! ----------------------