LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1049|回复: 6

GUI线程如何实现啊?

[复制链接]
发表于 2005-3-19 11:51:17 | 显示全部楼层 |阅读模式
想做一个东东,主线程用于任务的处理,GUI线程提供操作界面,刚接触java不太久,对多线程还不太清楚,请问一下朋友们,这个要如何实现啊?
写了一个例子,不知道是不是要这样子做?
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.util.*;

  5. public class UIThreadTest{
  6.         public static void main(String args[]){
  7.                 UIThread ut = new UIThread();
  8.                 Thread mm = new Thread(ut);
  9.                 mm.start();
  10.                 return;
  11.         }
  12.        
  13. }

  14. class UIThread implements Runnable{
  15.         class UI extends JFrame{
  16.                 public UI(){
  17.                         setSize(100,100);
  18.                         setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  19.                         addWindowListener(new WindowAdapter(){
  20.                                 public void windowClosing(WindowEvent e){
  21.                                         return;
  22.                                 }
  23.                         });
  24.                 }
  25.         }
  26.         public void run(){
  27.                 UI ui = new UI();
  28.                 ui.setVisible(true);
  29.         }       
  30. }
复制代码


UIThreadTest模拟主线程,UIThread模拟GUI线程。
发表于 2005-3-19 13:10:47 | 显示全部楼层
难道您的任务要不停的运行?
GUI是基于事件的,
把任务处理代码写到事件中就可以了,

或者在事件被激活时,
创建一个任务线程去执行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-19 13:24:48 | 显示全部楼层
主线程本身是一个server,做gui的目的只是用来部署server中的module,并且调用server的api注册和激活部署了的module。现在自己比较模糊的是,GUI线程要怎么调用主线程的API。:(
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-19 14:48:39 | 显示全部楼层
又写了一个实验的小例子,UIThreadTest为Test主程序,ServerThread模拟Server线程,UIThread模拟GUI线程,UIThread可以通过Server提供的几个static api来停止Server。
代码如下:
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.util.*;

  5. public class UIThreadTest{
  6.         public static void main(String args[]){
  7.                 Thread server = new Thread(new ServerThread());
  8.                 server.start();
  9.                 Thread ui = new Thread(new UIThread());
  10.                 ui.start();
  11.         }
  12.        
  13. }

  14. class ServerThread implements Runnable{
  15.         private static boolean status = true;
  16.         ServerThread(){}
  17.         private void service(int id){
  18.                 System.out.println("Server=>Service " + id);
  19.         }
  20.         public static boolean getStatus(){
  21.                 return status;
  22.         }
  23.         public static void setStatus(){
  24.                 status = !(status);
  25.         }
  26.         public void run(){
  27.                 System.out.println("Server=>Server running...");
  28.                 Random random = new Random(100);
  29.                 while(status){
  30.                         int id = Math.abs(random.nextInt()) % 100;
  31.                         try{
  32.                                 Thread.sleep(1000);
  33.                                 if(!status)
  34.                                         System.out.println("Server=>Server stopping...");
  35.                                 else
  36.                                         service(id);
  37.                         }catch(InterruptedException e){
  38.                         }
  39.                 }
  40.                 if(!status){
  41.                         System.out.println("Server=>Server stopped...");
  42.                 }
  43.         }
  44. }

  45. class UIThread implements Runnable{
  46.         private boolean fresh = true;
  47.         class UI extends JFrame{
  48.                 public JButton serverControl;
  49.                 public JLabel serverStatus;
  50.                 public UI(){
  51.                         serverControl = new JButton("Stop server");
  52.                         serverStatus = new JLabel("Readding Status...");
  53.                         serverControl.addActionListener(new ActionListener(){
  54.                                 public void actionPerformed(ActionEvent e){
  55.                                         System.out.println("UI=>Stop Server");
  56.                                         ServerThread.setStatus();
  57.                                         fresh = false;
  58.                                 }
  59.                         });
  60.                         getContentPane().add(serverControl, BorderLayout.NORTH);
  61.                         getContentPane().add(serverStatus, BorderLayout.SOUTH);
  62.                         setSize(200,200);
  63.                         setDefaultCloseOperation(DISPOSE_ON_CLOSE);
  64.                         addWindowListener(new WindowAdapter(){
  65.                                 public void windowClosing(WindowEvent e){
  66.                                         if(ServerThread.getStatus()){
  67.                                                 System.out.println("UI=>Stop Server");
  68.                                                 ServerThread.setStatus();
  69.                                                 fresh = false;
  70.                                         }
  71.                                         else
  72.                                                 return;
  73.                                 }
  74.                         });
  75.                 }
  76.         }
  77.         public void run(){
  78.                 UI ui = new UI();
  79.                 ui.setVisible(true);
  80.                 while(fresh){
  81.                         try{
  82.                                 Thread.sleep(1000);
  83.                         }catch(InterruptedException e){
  84.                         }
  85.                         if(!(ServerThread.getStatus()))
  86.                                 ui.serverStatus.setText("Server Stopped");
  87.                         else
  88.                                 ui.serverStatus.setText("Server Running");
  89.                 }
  90.         }       
  91. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-3-22 15:57:19 | 显示全部楼层
可以通过缓冲区互斥、同步的访问资源。
回复 支持 反对

使用道具 举报

发表于 2005-3-22 17:06:35 | 显示全部楼层
楼上的讲的...还可以去参考os里面的最后几章的内容...呵呵,开玩笑,回答问题也太抽象了
楼主你自己实现的还可以了
只要你的gui线程能拿到另外运行的线程的引用就可以了.然后提供改变一些flag来改变线程的运行状况当然其中要么轮询要么wait,notify(本质还是轮询,只不过是基于本地接口了,速度性能显著提高),就可以作到了.其他互斥,同步操作和其他语言没有什么太大区别,就不多说了,相信以楼主的能力能很轻松地做到的
回复 支持 反对

使用道具 举报

发表于 2005-3-24 01:39:26 | 显示全部楼层
swing本身是线程安全的,这意味者你不能使用swing线程来进行堵塞操作,因为这样会使s w ng 线程堵塞,比较好的办法是使用s w ng 的invokeAndWait或者是invokeLater来进行外部的线程操作,或者是使用observer模式来进行回调,通知GUI
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表