| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1115 人关注过本帖
标题:求助关于多线程
只看楼主 加入收藏
David001
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-8-3
收藏
 问题点数:0 回复次数:7 
求助关于多线程
一般多线程都是一个类继承Thread或实现Runnable,把要并行运行的代码放在public void run(){}方法中。然后在主方法或另一类中实例化该线程类,定义Thread对象,例t,最后用t.start();运行run()。
我现在碰到的问题是,它有一个功能运行某个测试,但测试耗时间,并且这时Swing程序窗体失去响应,我想对javaSwing程序作一个多线程,使得运行测试时,窗体界面仍能响应。我该如何设计?请众高手帮帮忙,急!
搜索更多相关主题的帖子: 线程 
2005-09-20 11:04
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
David001, 你的程序长不长?如果不长的话,把它贴上来。如果太长,比如多文件,发到我的邮箱,我帮你改一下。 我的邮箱为: kaihua1@yahoo.com

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-20 11:54
David001
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-8-3
收藏
得分:0 
已发到你的邮箱

2005-09-20 18:19
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
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; } } }

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-21 00:15
David001
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-8-3
收藏
得分:0 
万分感谢!参考了你的MultiThreadDemo 后我把多线程解决了。 关于那个 for (String se : tr.getSchemaError()) { schemaErr += se + "\n"; } 只有jdk1.5开始支持,1.5以下版本会报错的。

2005-09-22 14:35
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
David001, 你说得对,我也是刚刚体会到,我刚刚装了JDK1.5。 你的那个程序也太长了,看了就让人头大。得改改,把它拆成几个小的class 会好些。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-22 14:50
jnzsk
Rank: 1
等 级:新手上路
威 望:1
帖 子:403
专家分:0
注 册:2004-11-13
收藏
得分:0 
学习中!

2005-09-22 17:14
zhou
Rank: 1
等 级:禁止发言
帖 子:429
专家分:0
注 册:2006-6-16
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-03-31 10:00
快速回复:求助关于多线程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022033 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved