public class ThreadTest { public static void main(String args[]) { Thread thread1 = new Thread("thread1"); Thread thread1 = new Thread("thread2"); Thread thread1 = new Thread("thread1"); Thread thread1 = new Thread("thread1"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); thread1.join(); thread2.join(); thread3.join(); thread4.join(); System.err.println("threads end!"); } } public final void join() throws InterruptedException Waits for this thread to die. Throws: InterruptedException - if another thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
嗯,我是在做一个简单的抽奖程序,就是可以实现4个在JTextArea里的数字迅速滚动的效果,当用了cbhyk的方法以后,4个数字就没有以前滚动那么流畅了。。 大家帮忙看看,非常简单的,大致程序如下: int result=1+(int)(Math.random()*9999);//这里其实结果已经产生了 //下面就是让数字滚动
int digit1=result/1000; int digit2=result%1000/100; int digit3=result%1000%100/10; int digit4=result%1000%100%10; RandomNumberThread Thread1=new RandomNumberThread(numberArea1, Integer.parseInt(numberArea1.getText()),digit1); RandomNumberThread Thread2=new RandomNumberThread(numberArea2, Integer.parseInt(numberArea2.getText()),digit2); RandomNumberThread Thread3=new RandomNumberThread(numberArea3, Integer.parseInt(numberArea3.getText()),digit3); RandomNumberThread Thread4=new RandomNumberThread(numberArea4, Integer.parseInt(numberArea4.getText()),digit4); Thread1.start(); Thread2.start(); Thread3.start(); Thread4.start(); model.addElement("恭喜你: "+Integer.toString(result));//在一个JList里输出结果 要的就是当四个线程都执行完之后,JList里才输出结果
{
public static void main(String args[])
{
Thread thread1 = new Thread("thread1");
Thread thread1 = new Thread("thread2");
Thread thread1 = new Thread("thread1");
Thread thread1 = new Thread("thread1"); thread1.start();
thread2.start();
thread3.start();
thread4.start(); thread1.join();
thread2.join();
thread3.join();
thread4.join(); System.err.println("threads end!");
}
}
public final void join() throws InterruptedException
Waits for this thread to die.
Throws:
InterruptedException - if another thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
大家帮忙看看,非常简单的,大致程序如下:
int result=1+(int)(Math.random()*9999);//这里其实结果已经产生了 //下面就是让数字滚动
int digit1=result/1000;
int digit2=result%1000/100;
int digit3=result%1000%100/10;
int digit4=result%1000%100%10;
RandomNumberThread Thread1=new RandomNumberThread(numberArea1,
Integer.parseInt(numberArea1.getText()),digit1); RandomNumberThread Thread2=new RandomNumberThread(numberArea2,
Integer.parseInt(numberArea2.getText()),digit2);
RandomNumberThread Thread3=new RandomNumberThread(numberArea3,
Integer.parseInt(numberArea3.getText()),digit3);
RandomNumberThread Thread4=new RandomNumberThread(numberArea4,
Integer.parseInt(numberArea4.getText()),digit4); Thread1.start();
Thread2.start();
Thread3.start();
Thread4.start(); model.addElement("恭喜你: "+Integer.toString(result));//在一个JList里输出结果
要的就是当四个线程都执行完之后,JList里才输出结果
Integer.parseInt(numberArea2.getText()),digit2);RandomNumberThread接收三个参数,一个是控制的JTextArea,一个是JTextArea里最初的内容,一个是JTextArea里滚动后要达到的内容
不知道为什么,用setDaemon(true)有个IllegalThreadStateException异常出现!
在主线程里反复判断是否滚动完成,我想可能还是会影响滚动效果吧,不管怎么说,试试先
2、JavaVsNet是可行的方法,对速度影响可能小。可以用循环,在循环中加sleep。
代码如下 Thread1.start();
Thread2.start();
Thread3.start();
Thread4.start(); while(true)
{
if (Thread1.isEnd() && Thread2.isEnd() && Thread3.isEnd() &&
Thread4.isEnd())
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
model.addElement("恭喜你: " + Integer.toString(result));
}
});
return;
}
else
{
try
{
Thread.sleep(100);
}
catch(Exception event)
{ }
} }
hq1305018(跃强)的方法是不对的,setDaemon(true)是main()可以不管线程是否完成就结束,也强行结束可能还在alive的线程。 如果楼主是单CPU,就不要线程了吧,效率提高不了多少。这样就能顺序执行了!个人觉得是目前比较好的解决办法。
四个数字要滚动只有用循环,为了让四个数字能互不影响的滚动,而且四个数字要滚动到不同的结果,也就是说循环次数也不一样,如果不用线程怎么行???如果实在解决不了,只有将就交了。
虽然抽奖结果已经在JList里出来了,四个数字还在装模做样的滚动虚伪了点~
....
boolean bEnd = false;
Thread1.start();
Thread2.start();
Thread3.start();
Thread4.start();
while (!bEnd) {
try
{Thread.sleep(1000);}
catch(Exception e)
{System.out.println(e.getMessage());}
if (!Thread1.isAlive() && !Thread2.isAlive() && !Thread3.isAlive() && !Thread4.isAlive() ) {
System.out.println("main end");
bEnd = true;
}
}
import javax.swing.*;
import java.awt.*;import java.awt.event.*;
import com.borland.jbcl.layout.*;
public class MainFrame extends JFrame{
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JPanel jPanel3 = new JPanel();
JTextArea numberArea1 = new JTextArea();
JTextArea numberArea2 = new JTextArea();
JTextArea numberArea3 = new JTextArea();
JTextArea numberArea4 = new JTextArea(); JButton beginButton = new JButton();
JButton clearNumber = new JButton();
JButton clearAll = new JButton();
FlowLayout flowLayout1 = new FlowLayout(); BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel4 = new JPanel();
JScrollPane jScrollPane1 = new JScrollPane();
DefaultListModel model=new DefaultListModel();
JList resultList = new JList(model);
BorderLayout borderLayout2 = new BorderLayout();
GridBagLayout gridBagLayout1 = new GridBagLayout();
GridBagLayout gridBagLayout2 = new GridBagLayout(); public MainFrame() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout(borderLayout1);
jPanel1.setForeground(Color.lightGray);
jPanel1.setBorder(null);
jPanel1.setLayout(gridBagLayout2);
jPanel3.setLayout(gridBagLayout1);
beginButton.setText("开始抽奖");
beginButton.addActionListener(new MainFrame_beginButton_actionAdapter(this));
clearNumber.setText("数字复位");
clearNumber.addActionListener(new MainFrame_clearNumber_actionAdapter(this));
clearAll.setText("主复位");
clearAll.addActionListener(new MainFrame_clearAll_actionAdapter(this));
numberArea1.setFont(new java.awt.Font("Monospaced", 1, 70));
numberArea1.setText("0");
numberArea1.setName("numberArea1");
numberArea1.setEditable(false);
numberArea1.setLineWrap(false);
numberArea2.setFont(new java.awt.Font("Monospaced", 1, 70));
numberArea2.setText("0");
numberArea2.setName("numberArea2");
numberArea2.setEditable(false);
numberArea3.setFont(new java.awt.Font("Monospaced", 1, 70));
numberArea3.setText("0");
numberArea3.setEditable(false);
numberArea3.setName("numberArea3");
numberArea4.setFont(new java.awt.Font("Monospaced", 1, 70));
numberArea4.setText("0");
numberArea4.setName("numberArea4");
numberArea4.setEditable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setForeground(Color.lightGray);
this.setTitle("现场抽奖");
jPanel3.setBorder(BorderFactory.createLoweredBevelBorder());
jPanel2.setBackground(Color.lightGray);
jPanel2.setBorder(null);
jPanel2.setDebugGraphicsOptions(0);
jPanel2.setLayout(flowLayout1);
jPanel4.setLayout(borderLayout2);
jPanel2.add(beginButton, null);
jPanel2.add(clearNumber, null);
jPanel2.add(clearAll, null);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
jPanel3.add(numberArea2, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0
,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 0, 73, 0), -1, -3));
jPanel3.add(numberArea4, new GridBagConstraints(3, 0, 1, 1, 1.0, 1.0
,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 0, 73, 67), -1, -3));
jPanel3.add(numberArea3, new GridBagConstraints(2, 0, 1, 1, 1.0, 1.0
,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 0, 73, 0), -1, -3));
jPanel3.add(numberArea1, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(63, 53, 73, 0), -1, -3));
jPanel1.add(jPanel4, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0
,GridBagConstraints.CENTER, GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 110, 102));
jPanel4.add(jScrollPane1, BorderLayout.CENTER);
jScrollPane1.getViewport().add(resultList, null);
jPanel1.add(jPanel3, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
,GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 0, 0));
this.getContentPane().add(jPanel2, BorderLayout.SOUTH);
} void beginButton_actionPerformed(ActionEvent e) { final int result=1+(int)(Math.random()*9999);
System.out.println(result);
int digit1=result/1000;
int digit2=result%1000/100;
int digit3=result%1000%100/10;
int digit4=result%1000%100%10;
RandomNumberThread Thread1=new RandomNumberThread(numberArea1,
Integer.parseInt(numberArea1.getText()),digit1); RandomNumberThread Thread2=new RandomNumberThread(numberArea2,
Integer.parseInt(numberArea2.getText()),digit2);
RandomNumberThread Thread3=new RandomNumberThread(numberArea3,
Integer.parseInt(numberArea3.getText()),digit3);
RandomNumberThread Thread4=new RandomNumberThread(numberArea4,
Integer.parseInt(numberArea4.getText()),digit4); Thread1.start();
Thread2.start();
Thread3.start();
Thread4.start(); model.addElement("恭喜你:"+Integer.toString(result));
} void clearNumber_actionPerformed(ActionEvent e) {
numberArea1.setText("0");
numberArea2.setText("0");
numberArea3.setText("0");
numberArea4.setText("0"); } void clearAll_actionPerformed(ActionEvent e) {
numberArea1.setText("0");
numberArea2.setText("0");
numberArea3.setText("0");
numberArea4.setText("0");
model.clear(); }
}class MainFrame_beginButton_actionAdapter implements java.awt.event.ActionListener {
MainFrame adaptee; MainFrame_beginButton_actionAdapter(MainFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.beginButton_actionPerformed(e);
}
}class MainFrame_clearNumber_actionAdapter implements java.awt.event.ActionListener {
MainFrame adaptee; MainFrame_clearNumber_actionAdapter(MainFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.clearNumber_actionPerformed(e);
}
}class MainFrame_clearAll_actionAdapter implements java.awt.event.ActionListener {
MainFrame adaptee; MainFrame_clearAll_actionAdapter(MainFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.clearAll_actionPerformed(e);
}
}
private int initNumber;
private int finalNumber;
private int times; public RandomNumberThread(JTextArea textArea,int number1,int number2)
{
super("RandomNumberThread: "+textArea.getName());
numberArea=textArea;
initNumber=number1;
finalNumber=number2;
if(number1<=number2)
times=41+Math.abs(number1-number2);
else
times=41-Math.abs(number1-number2); } public void run()
{
int j=initNumber;
for(int i=0;i<times;i++)
{
try
{
Thread.sleep(10);
}
catch(InterruptedException e)
{
System.err.println(e.toString());
}
SwingUtilities.invokeLater(new ChangeNumber(numberArea,j));
j++;
if(j>=10)
j=0;
} }
private class ChangeNumber implements Runnable
{
private String numberToDisplay;
private JTextArea displayArea;
public ChangeNumber(JTextArea textArea,int number)
{
numberToDisplay=Integer.toString(number);
displayArea=textArea;
}
public void run()
{ displayArea.setText(numberToDisplay);
}
}
}
{
MainFrame mainFrame=new MainFrame();
mainFrame.setSize(400,300);
mainFrame.setResizable(false);
mainFrame.setVisible(true);
}}虽然看起来长了的,其实非常简单,在JBuilder里直接运行就可以了
有什么不好的地方,请大家指教!