求助关于多线程
一般多线程都是一个类继承Thread或实现Runnable,把要并行运行的代码放在public void run(){}方法中。然后在主方法或另一类中实例化该线程类,定义Thread对象,例t,最后用t.start();运行run()。我现在碰到的问题是,它有一个功能运行某个测试,但测试耗时间,并且这时Swing程序窗体失去响应,我想对javaSwing程序作一个多线程,使得运行测试时,窗体界面仍能响应。我该如何设计?请众高手帮帮忙,急!
搜索更多相关的解决方案:
线程
----------------解决方案--------------------------------------------------------
David001, 你的程序长不长?如果不长的话,把它贴上来。如果太长,比如多文件,发到我的邮箱,我帮你改一下。 我的邮箱为: kaihua1@yahoo.com
----------------解决方案--------------------------------------------------------
已发到你的邮箱
----------------解决方案--------------------------------------------------------
David001, 你的程序我看到了,先给你提以下几点建议: 1)用JBuilder, 但不要用JBuilder Design 2)程序不能等到全部写完再来编译,到那时修复错误的难度将很大。 3)不要将某一个文件写得过长,在1000行之内是可以接受的。如果更严格的来讲,尽量控制在700行以下。 现在来说说你的程序, 你的程序中的一个文件实在太长。文件过长,也说明OOP还不够。 第一次编译出现49个错误 其中有一个错误是反复的出现,那就是 TestXBRL.java 中的第743 行的那个 for loop. 你是这样写的: for (String se : tr.getSchemaError()) { schemaErr += se + "\n"; } 在改掉这个错误后,出现了其他的错误,还有就是你的第三方文件也没给全,所以无法编译。 我写了一个MultiThreadDemo, 你可以参考. 代码如下: import java.util.*; import javax.swing.JFrame; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.Color; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.Graphics; import java.awt.Dimension; public class MultiThreadDemo extends JFrame { TimeThread timeThread = new TimeThread(" "); DrawSomething drawThread = new DrawSomething(); public MultiThreadDemo() { super("MultiThreadDemo"); drawThread.setBackground(Color.white); JPanel contentJP = new JPanel(new BorderLayout()); contentJP.add(drawThread, BorderLayout.CENTER); contentJP.add(timeThread, BorderLayout.SOUTH); setContentPane(contentJP); timeThread.start(); drawThread.start(); addWindowListener(new WinClosing()); super.setSize(500, 300); } public static void main(String [] args) { MultiThreadDemo mtd = new MultiThreadDemo(); mtd.setVisible(true); } class WinClosing extends WindowAdapter { public void windowClosing(WindowEvent e) { drawThread.stop(); timeThread.stop(); System.exit(0); } } class DrawSomething extends JPanel implements Runnable { Thread drawThread; Dimension d; int h, w; int startX, startY, endX, endY; DrawSomething() { drawThread = new Thread(this); } public void start() { drawThread.setName("Drawer"); drawThread.start(); } public void stop() { drawThread = null; } public void paintComponent(Graphics g) { d = getSize(); h = d.height; w = d.width; startX = (int)(Math.random()*w) % w; startY = (int)(Math.random()*h) % h; endX = (int)(Math.random()*w) % w; endY = (int)(Math.random()*w) % h; super.paintComponent(g); g.drawLine(startX, startY, endX, endY); } /** * run */ public void run() { while(drawThread != null) { repaint(); try { Thread.sleep(500); } catch (InterruptedException ie) { ie.printStackTrace(); } } } } class TimeThread extends JLabel implements Runnable { CurrentTimer currentTimer; Thread timer; String currentTimeStr = null; TimeThread(String s) { super(s, JLabel.RIGHT); currentTimer = new CurrentTimer(); timer = new Thread(this); } public void start() { timer.setName("Timer"); timer.start(); } public void stop() { timer = null; } public boolean isRunning() { return timer.isAlive(); } /** * run */ public void run() { while(timer != null) { currentTimeStr = currentTimer.getCurrentTime(); super.setText(currentTimeStr); super.updateUI(); try { Thread.sleep(300); } catch (InterruptedException ie) { System.err.println(ie.toString()); } } } public String getCurrentTime() { return currentTimeStr; } } public class CurrentTimer { public String getCurrentTime() { String hour24Str = null; String minStr = null; Calendar c = new GregorianCalendar(); int hour24 = c.get(Calendar.HOUR_OF_DAY); int min = c.get(Calendar.MINUTE); if(hour24/10 == 0) hour24Str = "0" + new Integer(hour24).toString(); else hour24Str = new Integer(hour24).toString(); if(min/10 == 0) minStr = "0" + new Integer(min).toString(); else minStr = new Integer(min).toString(); String currentTimeStr = hour24Str + ":" + minStr; return currentTimeStr; } } }
----------------解决方案--------------------------------------------------------
万分感谢!参考了你的MultiThreadDemo 后我把多线程解决了。 关于那个 for (String se : tr.getSchemaError()) { schemaErr += se + "\n"; } 只有jdk1.5开始支持,1.5以下版本会报错的。
----------------解决方案--------------------------------------------------------
David001, 你说得对,我也是刚刚体会到,我刚刚装了JDK1.5。 你的那个程序也太长了,看了就让人头大。得改改,把它拆成几个小的class 会好些。
----------------解决方案--------------------------------------------------------
学习中!
----------------解决方案--------------------------------------------------------