请问java怎么实现两个线程同步?
我有两个线程A线程是在磁盘上创建一个文件,B线程是压缩这个文件,请问该如何同步处理?我的A线程是将一个word文件转换成pdf而B线程是再将此pdf文件转换为swf文件小...
我有两个线程A线程是在磁盘上创建一个文件,B线程是压缩这个文件,请问该如何同步处理?
我的A线程是将一个word文件转换成pdf而B线程是再将此pdf文件转换为swf文件
小弟线程学的不好,请各位给段简略的代码例子,(不用实现转换功能,就只是个操作文件同步的例子就行了,回答正确有高分追加!) 展开
我的A线程是将一个word文件转换成pdf而B线程是再将此pdf文件转换为swf文件
小弟线程学的不好,请各位给段简略的代码例子,(不用实现转换功能,就只是个操作文件同步的例子就行了,回答正确有高分追加!) 展开
4个回答
展开全部
第一种 使用Lock 第二种 synchronized (a) A 做完了 释放a B继续锁住a 就可以了
synchronized 锁住的时候 其他对象是不能访问的 这样实现同步
你定义一个数 随便定义 如 int i=10;
在 word文件转换成pdf 的方法里 添加 synchronized (i) 记得方法结束一定要释放 wait() notify()
同理 另外一个方法也是添加 synchronized (i) 由于锁住的是一个同一个对象 (属性也是可以滴。。) 所以不释放 另外一个线程不会调用这个方法
synchronized 锁住的时候 其他对象是不能访问的 这样实现同步
你定义一个数 随便定义 如 int i=10;
在 word文件转换成pdf 的方法里 添加 synchronized (i) 记得方法结束一定要释放 wait() notify()
同理 另外一个方法也是添加 synchronized (i) 由于锁住的是一个同一个对象 (属性也是可以滴。。) 所以不释放 另外一个线程不会调用这个方法
展开全部
首先两个线程都要操作pdf文件。如果同时操作会出错,这里有个先后顺序。设置一把锁,这个锁就是这个pdf文档对象。
public class ATread extends Thread{
private PDF pdf;
public AThread(PDF pdf){
this.pdf=pdf;
}
public void run(){
写入内容
pdf.notify();//唤醒B线程
}
}
public class BTread extends Thread{
private PDF pdf;
public BThread(PDF pdf){
this.pdf=pdf;
public void run(){
if(可读文件为空){
//等待A线程写入内容到pdf文档
pdf.wait();
}
else{
进行转换
}
}
}
public class PDF{
public PDF(){
File f=new File("xxx.pdf");
if(f不存在)
创建f;
}
}
public class MainClass{
public static void main(String[] args){
PDF pdf=new PDF();
AThread A=new AThread(pdf);
BThread B=new BThread(pdf);
A.start();
B.start();
}
}
如果是B先拿到cpu时间,因为文件是空的,B会等待,直到A转换完成唤醒B。B等待的时候,剩下A和main线程抢cpu。main拿到cpu对程序没影响。我不清楚压缩的原理,所以不知道可不可以不用等待A一次完成再去唤醒B,然后A再写入新的东西。
public class ATread extends Thread{
private PDF pdf;
public AThread(PDF pdf){
this.pdf=pdf;
}
public void run(){
写入内容
pdf.notify();//唤醒B线程
}
}
public class BTread extends Thread{
private PDF pdf;
public BThread(PDF pdf){
this.pdf=pdf;
public void run(){
if(可读文件为空){
//等待A线程写入内容到pdf文档
pdf.wait();
}
else{
进行转换
}
}
}
public class PDF{
public PDF(){
File f=new File("xxx.pdf");
if(f不存在)
创建f;
}
}
public class MainClass{
public static void main(String[] args){
PDF pdf=new PDF();
AThread A=new AThread(pdf);
BThread B=new BThread(pdf);
A.start();
B.start();
}
}
如果是B先拿到cpu时间,因为文件是空的,B会等待,直到A转换完成唤醒B。B等待的时候,剩下A和main线程抢cpu。main拿到cpu对程序没影响。我不清楚压缩的原理,所以不知道可不可以不用等待A一次完成再去唤醒B,然后A再写入新的东西。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
靠,你这能叫同步吗,你还敢这边没写完那边就开始压缩啊。学东西都学死了,在多线程下去连死活都能并发了,一边死一边复活。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对同一个对象进行加锁。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询