线程回调

本文展示了一个Java Swing应用程序示例,通过使用Callable接口和Future来实现多线程任务的回调功能。该程序允许用户输入命令并执行这些命令,同时显示执行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有关线程回调的例子,摘自javaeye的问题回答区:

 

package cn.edu.xupt.chapter01.knight;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

/**
 * Title: 企业年金基金受托管理系统<br>
 * Description: 测试回调,执行脚本等小功能<br>
 * Description: 也可以直接解析流,此处是学习多线程的回调功能 Copyright: Copyright (c) 2009<br>
 * Company: UFIDA<br>
 * 
 * @author cjy
 * @version 1.0
 */
public class TestCallable extends JFrame implements KeyListener, ActionListener {

	/**
	 * 序列号
	 */
	private static final long serialVersionUID = -11026086618847428L;
	/** 本类接口 */
	private CallableBO bo = new CallableBO();
	/** 文本域 */
	private JTextArea textArea;
	/** 滚动窗口 */
	private JScrollPane jscroll;
	/** 输入命令窗口 */
	private JTextField field;
	/** 执行按钮 */
	private JButton okButton;
	/** 清空按钮 */
	private JButton clearButton;

	/**
	 * 构造器
	 */
	public TestCallable() {

		// 初始化组件
		textArea = new JTextArea();
		textArea.setEditable(false);
		jscroll = new JScrollPane(textArea);
		JLabel label = new JLabel("请输入待执行的命令(输入file可选择文件):");
		field = new JTextField();
		field.setPreferredSize(new Dimension(200, 25));
		field.addKeyListener(this);
		JPanel commPanel = new JPanel();
		okButton = new JButton("执行");
		okButton.addActionListener(this);
		clearButton = new JButton("清空");
		clearButton.addActionListener(this);
		commPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
		commPanel.add(label);
		commPanel.add(field);
		commPanel.add(okButton);
		commPanel.add(clearButton);
		// 部署组件
		Container con = this.getContentPane();
		con.setLayout(new BorderLayout());
		con.setPreferredSize(new Dimension(600, 400));
		con.add(commPanel, BorderLayout.NORTH);
		con.add(jscroll, BorderLayout.CENTER);

		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
	}

	public static void main(String[] args) {

		SwingUtilities.invokeLater(new Runnable() {

			public void run() {
				new TestCallable();
			}

		});
	}

	public void keyTyped(KeyEvent e) {

	}

	public void keyPressed(KeyEvent e) {

	}

	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode() == java.awt.event.KeyEvent.VK_ENTER) {
			onExe();
		}
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource().equals(okButton)) {
			onExe();
		} else if (e.getSource().equals(clearButton)) {
			textArea.setText("");
			field.setText("");
		}
	}

	/**
	 * 界面执行触发的事件
	 */
	private void onExe() {
		String text = field.getText();
		if (text != null && !text.equals("")) {
			System.out.println(text);
			// 特殊处理file
			if (text.equals("file")) {
				final JFileChooser jf = new JFileChooser("Title...");
				jf.setDialogTitle("选择执行的命令文件...");
				SwingUtilities.invokeLater(new Runnable() {

					public void run() {
						int result = jf.showOpenDialog(TestCallable.this);
						jf.setVisible(true);
						File selectedFile = null;
						if (result == JFileChooser.APPROVE_OPTION) {
							selectedFile = jf.getSelectedFile();
							if (selectedFile.exists()) {
								textArea
										.setText(bo.exe(selectedFile.getPath()));
								return;
							}
						}
					}
				});

			} else {
				textArea.setText(bo.exe(text));
			}
		}
	}

}

class CallableBO {

	/**
	 * 执行命令
	 * 
	 * @param comm
	 * @return
	 */
	public String exe(String comm) {
		try {
			Runtime rt = Runtime.getRuntime();
			Process proc = rt.exec(comm);
			ExecutorService pool = Executors.newFixedThreadPool(3);
			Callable<String> err = new S(proc.getErrorStream(), "错误信息");
			Callable<String> out = new S(proc.getInputStream(), "终端信息");
			Future<String> e = pool.submit(err);
			Future<String> o = pool.submit(out);
			return o.get() + "\n" + e.get();
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		} catch (ExecutionException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	private final class S implements Callable<String> {

		/** 返回信息 */
		private StringBuffer msg = new StringBuffer();
		/** 读取流 */
		private InputStream is;
		/** 信息类型 */
		private String msgType;

		public S(InputStream is, String msgType) {
			this.is = is;
			this.msgType = msgType;
		}

		public String call() {
			try {
				InputStreamReader isr = new InputStreamReader(is);
				BufferedReader br = new BufferedReader(isr);
				String line = null;
				msg.append(msgType + ":\n");
				while ((line = br.readLine()) != null) {
					if (!line.equals("")) {
						System.out.println(msgType + ">" + line);
						msg.append(line + " \n ");
					}
				}
				return msg.toString();
			} catch (IOException ioe) {
				ioe.printStackTrace();
				return null;
			}
		}

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值