java线程睡眠问题

kared 2012-12-23 10:45:48
这是我的代码
package org.com.JframeDemo;

public class ControlClass {
private int readCount; // 需要读的读者
private int writeCount; // 需要写的写者
private boolean cRead; // 读者的状态
private boolean cWrite; // 学者的状态
public static int a;

public ControlClass() { // 初始化数据
readCount = 0;
writeCount = 0;
cRead = false;
cWrite = false;
}

public static void sleeptime() { // 睡眠时间
int sleepTime = (int) (Math.random());
try {
Thread.sleep(sleepTime * 10000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

public synchronized void startRead() { // 读者开始读取
if (cRead == false) {
while (writeCount > 0) { // 写者优先
try {
a=0;
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(e.toString());
e.printStackTrace();
}
}
}
readCount++;
if (readCount == 1) {
cRead = true; // 返回有读者正在读
}
}

public synchronized void endRead() { // 读者结束读取
--readCount;
if (readCount == 0) {
cRead = false;
}
notifyAll(); // 释放空间

}

public synchronized void startWrite() { // 写者开始写
writeCount++;
if (cRead == true || cWrite == true) {
a=1;
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println(e.toString());
e.printStackTrace();
}
}
cWrite = true;
}

public synchronized void endWrite() {
writeCount++;
cWrite = false;
notifyAll();
}
}


package org.com.JframeDemo;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JTextArea;

public class Reader implements Runnable {
private ControlClass controlClass;
private JTextArea t;
private int reader;
public static String str = "",time1,time2;

public Reader(int reader, JTextArea t, ControlClass controlClass) {
this.reader = reader;
this.t = t;
this.controlClass = controlClass;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
final SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
time1 = format.format(new Date());
str = time1+"读者" + reader + "准备读取" + '\n';
t.append(str);
controlClass.startRead(); // 读者开始工作
str = "读者" + reader + "正在读取" + '\n';
t.append(str);
ControlClass.sleeptime(); // 读者处于工作阶段
controlClass.endRead(); // 读者结束读取
str = "读者" + reader + "完成读取" + '\n';
t.append(str);
}
}
}


package org.com.JframeDemo;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JTextArea;

public class Writer implements Runnable {
private ControlClass controlClass;
private int writer;
private JTextArea t;
public static String str,time1,time2;

public Writer(int writer, JTextArea t, ControlClass controlClass) {
this.writer = writer;
this.t = t;
this.controlClass = controlClass;

}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
final SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
time1 = format.format(new Date());
str = time1+"写者" + writer + "准备写取" + '\n';
t.append(str);
controlClass.startWrite();
str = "写者" + writer + "正在写取" + '\n';
t.append(str);
ControlClass.sleeptime();
controlClass.endRead();
str = "写者" + writer + "完成写取" + '\n';
t.append(str);
}
}
}


package org.com.JframeDemo;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;

public class ThreadTest extends JFrame {
JButton start, end;
JPanel[] LL;
JTextArea[] T;// 存放信息
JScrollPane[] S;
public ThreadTest() {
setTitle("读者写者问题模拟");
setSize(600, 650);
JPanel panel = new JPanel();
JPanel p2 = new JPanel();
JToolBar TB = new JToolBar();
Container ct = this.getContentPane();

LL = new JPanel[7];
T = new JTextArea[7];
S = new JScrollPane[7];
for (int i = 1; i <= 6; i++) {

LL[i] = new JPanel();
T[i] = new JTextArea();

T[i].setPreferredSize(new Dimension(550, 600));
S[i] = new JScrollPane();
S[i].setPreferredSize(new Dimension(400, 150));
LL[i].setPreferredSize(new Dimension(650, 70));
S[i].add(T[i]);
S[i].setViewportView(T[i]);
LL[i].add(S[i]);
}
// 读者线程
start = new JButton("开始");
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
ControlClass controlClass=new ControlClass();
Reader r1 = new Reader(1, T[1], controlClass);
Reader r2 = new Reader(2, T[2], controlClass);
Reader r3 = new Reader(3, T[3], controlClass);
Reader r4 = new Reader(4, T[4], controlClass);
// 写者线程
Writer w1 = new Writer(1, T[5], controlClass);
Writer w2 = new Writer(2, T[6], controlClass);
Thread demo01 = new Thread(r1);
demo01.start();
Thread demo02 = new Thread(r2);
demo02.start();
Thread demo03 = new Thread(r3);
demo03.start();
Thread demo05 = new Thread(w1);
demo05.start();
Thread demo04 = new Thread(r4);
demo04.start();
Thread demo06 = new Thread(w2);
demo06.start();
}
});

end = new JButton("结束");
end.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
TB.add(start);
TB.add(end);
add(TB, BorderLayout.NORTH);
ct.add(panel, BorderLayout.SOUTH);
p2.add(LL[1]);
p2.add(LL[2]);
p2.add(LL[3]);
p2.add(LL[4]);
p2.add(LL[5]);
p2.add(LL[6]);
ct.add(p2, BorderLayout.CENTER);

}

public static void main(String[] args) {
ThreadTest threadTests = new ThreadTest();
threadTests.setVisible(true);
threadTests.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}


我明明已经调用了睡眠函数,可是我调用系统时间的时候,且发现我的线程根本没有睡眠,不知道是怎么回事?
...全文
188 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 kared 的回复:
引用 2 楼 twtiyb 的回复:int sleepTime = (int) (Math.random()); 。。你这。。sleepTime永远是0呀。。 应该这样乘。 int sleepTime = (int) (Math.random()*100000); 嗯 谢谢啊 我终于发现了错误
是不是可以结帖呀。
kared 2012-12-24
  • 打赏
  • 举报
回复
引用 2 楼 twtiyb 的回复:
int sleepTime = (int) (Math.random()); 。。你这。。sleepTime永远是0呀。。 应该这样乘。 int sleepTime = (int) (Math.random()*100000);
嗯 谢谢啊 我终于发现了错误
  • 打赏
  • 举报
回复
int sleepTime = (int) (Math.random()); 。。你这。。sleepTime永远是0呀。。 应该这样乘。 int sleepTime = (int) (Math.random()*100000);
MiceRice 2012-12-23
  • 打赏
  • 举报
回复
程序太长了,抓不到重点。。。。。。 另外也没发现你在sleep()之后有输出系统时间的语句,之前倒是找到了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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