一个非常奇怪的死锁问题

dongle2001 2010-02-26 11:28:00
我安装了openoffice的便携版本,然后每次系统启动之后,用三种不同的方式启动uno服务,得到的结果不同。
如果手动打开cmd,执行“soffice -headless -accept="socket,host=localhost,port=8100;urp;" -nofirststartwizard”命令,则一切正常,服务正常启动。
如果使用bat的方式,启动uno服务,则服务死锁,无法启动。关掉cmd窗口,再一次启动bat,则一切正常,服务正常启动。
如果使用java的Runtime.getRuntime().exec启动uno服务,则服务死锁,无法启动。关闭java程序,然后重新运行一次,则一切正常,服务正常启动。

谁能帮我分析一下,这到底是什么原因造成的?
...全文
114 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
智鹿软件 2010-03-03
  • 打赏
  • 举报
回复
package Thread;

public class TwoThread {
public static void main(String[] args) {
Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
Producer p=new Producer (q);//让new出的p去往q里面put
Customer c=new Customer (q);//让new出的c从q中get
p.start();//p和q开始的顺序并不报错
c.start();

}
}
class Producer extends Thread
{
Queue q;
public Producer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的put方法
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
q.put(i);//此处只是让q去put 10次
System.out.println("Producer put "+i);//并且输出本次放的是第几杯
}
}
}
class Customer extends Thread
{
Queue q;
public Customer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的get方法
}
@Override
public void run() {
while (true) {//死循环:只要q里面有,就去get
//get方法有返回值,返回值就是producer所put的数量
//此处也不需要去考虑是第几杯
//在Queue中的value解决可这一问题:
//put中的I赋给value,get方法有返回值就value的值
System.out.println("Customer get "+q.get());
//如果循环完了,就跳出循环,否则线程不会自己结束
if (q.value==9) {
break;
}
}

}
}
class Queue
{
int value;
boolean bFull=false;
public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
{
if (!bFull) {//条件为真(如果没满,就倒水)
value=i;//给value赋值,现在有几杯水
bFull=true;//满了
notify();//唤醒其他线程(让customer去get)
}
try {
wait();//告诉customer去get后自己等待customer的get结束
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized int get()
{
if (!bFull) {//如果没满就等待,如果满了就不进 **这就是为什么main里面谁先开始不报错的原因**
//get和put方法中的if条件判断起到了至关重要的作用
try {
wait();
} catch (InterruptedException e) {

e.printStackTrace();
}
}
bFull =false;//赋值为没满
notify();//唤醒producer去put
return value;//get的返回值就是put的时候给value赋的值
}
}
bayougeng 2010-02-26
  • 打赏
  • 举报
回复
你用bat怎么启动的?bat脚本怎么写的?
有错误信息么?
dongle2001 2010-02-26
  • 打赏
  • 举报
回复
发现问题所在了,因为使用bat和java的方式,如果soffice进程不结束,就不回返回。但是为什么手动执行命令的时候,soffice不结束也会返回到cmd呢?
bayougeng 2010-02-26
  • 打赏
  • 举报
回复
Runtime.getRuntime().exec("cmd /c ...");
这样也不行么?
dongle2001 2010-02-26
  • 打赏
  • 举报
回复
引用 1 楼 bayougeng 的回复:
你用bat怎么启动的?bat脚本怎么写的?
有错误信息么?

没有错误,直接死锁。
wenjjing2lianee 2010-02-26
  • 打赏
  • 举报
回复
搞不懂为什么,第一次为什么不成功,楼上说的有点道理,bat第一次运行有错没..

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧