设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Java 程序设计开发讨论
›
GUI线程如何实现啊?
返回列表
查看:
1049
|
回复:
6
GUI线程如何实现啊?
[复制链接]
xlwcat
xlwcat
当前离线
积分
303
IP卡
狗仔卡
发表于 2005-3-19 11:51:17
|
显示全部楼层
|
阅读模式
想做一个东东,主线程用于任务的处理,GUI线程提供操作界面,刚接触java不太久,对多线程还不太清楚,请问一下朋友们,这个要如何实现啊?
写了一个例子,不知道是不是要这样子做?
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class UIThreadTest{
public static void main(String args[]){
UIThread ut = new UIThread();
Thread mm = new Thread(ut);
mm.start();
return;
}
}
class UIThread implements Runnable{
class UI extends JFrame{
public UI(){
setSize(100,100);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
return;
}
});
}
}
public void run(){
UI ui = new UI();
ui.setVisible(true);
}
}
复制代码
UIThreadTest模拟主线程,UIThread模拟GUI线程。
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
sinpool
sinpool
当前离线
积分
131
IP卡
狗仔卡
发表于 2005-3-19 13:10:47
|
显示全部楼层
难道您的任务要不停的运行?
GUI是基于事件的,
把任务处理代码写到事件中就可以了,
或者在事件被激活时,
创建一个任务线程去执行。
回复
支持
反对
使用道具
举报
显身卡
xlwcat
xlwcat
当前离线
积分
303
IP卡
狗仔卡
楼主
|
发表于 2005-3-19 13:24:48
|
显示全部楼层
主线程本身是一个server,做gui的目的只是用来部署server中的module,并且调用server的api注册和激活部署了的module。现在自己比较模糊的是,GUI线程要怎么调用主线程的API。:(
回复
支持
反对
使用道具
举报
显身卡
xlwcat
xlwcat
当前离线
积分
303
IP卡
狗仔卡
楼主
|
发表于 2005-3-19 14:48:39
|
显示全部楼层
又写了一个实验的小例子,UIThreadTest为Test主程序,ServerThread模拟Server线程,UIThread模拟GUI线程,UIThread可以通过Server提供的几个static api来停止Server。
代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class UIThreadTest{
public static void main(String args[]){
Thread server = new Thread(new ServerThread());
server.start();
Thread ui = new Thread(new UIThread());
ui.start();
}
}
class ServerThread implements Runnable{
private static boolean status = true;
ServerThread(){}
private void service(int id){
System.out.println("Server=>Service " + id);
}
public static boolean getStatus(){
return status;
}
public static void setStatus(){
status = !(status);
}
public void run(){
System.out.println("Server=>Server running...");
Random random = new Random(100);
while(status){
int id = Math.abs(random.nextInt()) % 100;
try{
Thread.sleep(1000);
if(!status)
System.out.println("Server=>Server stopping...");
else
service(id);
}catch(InterruptedException e){
}
}
if(!status){
System.out.println("Server=>Server stopped...");
}
}
}
class UIThread implements Runnable{
private boolean fresh = true;
class UI extends JFrame{
public JButton serverControl;
public JLabel serverStatus;
public UI(){
serverControl = new JButton("Stop server");
serverStatus = new JLabel("Readding Status...");
serverControl.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("UI=>Stop Server");
ServerThread.setStatus();
fresh = false;
}
});
getContentPane().add(serverControl, BorderLayout.NORTH);
getContentPane().add(serverStatus, BorderLayout.SOUTH);
setSize(200,200);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
if(ServerThread.getStatus()){
System.out.println("UI=>Stop Server");
ServerThread.setStatus();
fresh = false;
}
else
return;
}
});
}
}
public void run(){
UI ui = new UI();
ui.setVisible(true);
while(fresh){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
}
if(!(ServerThread.getStatus()))
ui.serverStatus.setText("Server Stopped");
else
ui.serverStatus.setText("Server Running");
}
}
}
复制代码
回复
支持
反对
使用道具
举报
显身卡
sinpool
sinpool
当前离线
积分
131
IP卡
狗仔卡
发表于 2005-3-22 15:57:19
|
显示全部楼层
可以通过缓冲区互斥、同步的访问资源。
回复
支持
反对
使用道具
举报
显身卡
popeyelin
popeyelin
当前离线
积分
135
IP卡
狗仔卡
发表于 2005-3-22 17:06:35
|
显示全部楼层
楼上的讲的...还可以去参考os里面的最后几章的内容...呵呵,开玩笑,回答问题也太抽象了
楼主你自己实现的还可以了
只要你的gui线程能拿到另外运行的线程的引用就可以了.然后提供改变一些flag来改变线程的运行状况当然其中要么轮询要么wait,notify(本质还是轮询,只不过是基于本地接口了,速度性能显著提高),就可以作到了.其他互斥,同步操作和其他语言没有什么太大区别,就不多说了,相信以楼主的能力能很轻松地做到的
回复
支持
反对
使用道具
举报
显身卡
blader
blader
当前离线
积分
26
IP卡
狗仔卡
发表于 2005-3-24 01:39:26
|
显示全部楼层
swing本身是线程安全的,这意味者你不能使用swing线程来进行堵塞操作,因为这样会使s w ng 线程堵塞,比较好的办法是使用s w ng 的invokeAndWait或者是invokeLater来进行外部的线程操作,或者是使用observer模式来进行回调,通知GUI
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表