不是什么监听,第一个Frame实际上也是一个线程, 所谓传递,实际上就是线程间共享对象。 我把源代码写出来算了,供楼主参考。import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane;public class Thread0 extends JFrame implements Runnable, ActionListener { private SharedObject so; private int number; public Thread0(SharedObject so, int number) { this.so = so; this.number = number; init(); } void init() { JButton b = new JButton("Click Me"); b.addActionListener(this); getContentPane().add(b); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocation(300, 200); pack(); show(); } public void actionPerformed(ActionEvent ae) { new Thread(this).start(); Thread1 t1 = new Thread1(so, 1); Thread2 t2 = new Thread2(so, 2); t1.start(); t2.start(); so.put(0, "Hello World"); } public void run() { String s = so.get(0); System.out.println("get in thread " + number + ": " + s); JOptionPane.showMessageDialog(this, s); }
public static void main(String[] args) { SharedObject so = new SharedObject(); Thread0 t0 = new Thread0(so, 0); t0.show(); }}////// public class Thread1 extends Thread { private SharedObject so; private int number; public Thread1(SharedObject so, int number) { this.so = so; this.number = number; } public void run() { String s = so.get(1); System.out.println("get in thread " + number + ": " + s); so.put(1, s); } } /////////////// public class Thread2 extends Thread { private SharedObject so; private int number; public Thread2(SharedObject so, int number) { this.so = so; this.number = number; } public void run() { String s = so.get(2); System.out.println("get in thread " + number + ": " + s); so.put(2, s); } } ///////////// public class SharedObject {
private String contents; private boolean[] available = new boolean[3]; public synchronized String get(int i) { while (!available[i]) { // no new contents put by Producer try { wait(); } catch (InterruptedException e) { } } available[i] = false; return contents; }
线程可以理解为属于进程的某段执行着的代码流.同属于一个进程的线程之间可以共享进程的内存空间,系统资源.每个线程有属于自己的堆栈空间
操作系统调度切换多个线程要比调度切换进程在速度上快得多.而且进程间内存无法共享,通讯也比较麻烦.进程之间由于共享进程内存空间,所以交换数据非常方便
在windows中,进程和线程是不同的核心对象,一个进程必须要有一个进程;而在一些LINUX/UNIX中,线程的实现是通过一些多线程代码库来完成,在OS看来还是一个个的进程;在SOLARIS中,折中一个进程可以拥有多个轻量级进程,一个轻量级进程可以拥有多个线程
JAVA中可以用两种办法来实现多线程:继承Thread类或实现Runnable接口
java用Tread类来实现对线程的封装。一旦创建了一个Tread类实例,JVM就会为你创建一个线程。在JAVA语言中,这是创建线程的唯一办法。一旦调用了Tread类的start()方法,线程就运行起来了
Runnable接口为那些想参与到Tread运行中的JAVA类提供了一个通用的接口,只要是实现了Runnable接口的JAVA类,就能够作为Tread的执行体,在多线程中运行;其定义了一个方法:public void run();
如果用C语言来写WINDOWS平台下的线程应用,则通过系统函数CreateThread()来创建一个线程,在调用该函数时得指定一个函数入口作为线程的执行体,当线程运行的时候,其执行目标就是创建该线程时传入的那个函数;其原型为:long thread_start_routine(void*);
只学习了构造新线程的方法。帮你UPUP
所谓传递,实际上就是线程间共享对象。
我把源代码写出来算了,供楼主参考。import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;public class Thread0 extends JFrame implements Runnable, ActionListener { private SharedObject so;
private int number; public Thread0(SharedObject so, int number) {
this.so = so;
this.number = number;
init();
} void init() {
JButton b = new JButton("Click Me");
b.addActionListener(this);
getContentPane().add(b);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(300, 200);
pack();
show();
} public void actionPerformed(ActionEvent ae) {
new Thread(this).start();
Thread1 t1 = new Thread1(so, 1);
Thread2 t2 = new Thread2(so, 2);
t1.start();
t2.start();
so.put(0, "Hello World");
} public void run() {
String s = so.get(0);
System.out.println("get in thread " + number + ": " + s);
JOptionPane.showMessageDialog(this, s);
}
public static void main(String[] args) {
SharedObject so = new SharedObject();
Thread0 t0 = new Thread0(so, 0);
t0.show();
}}//////
public class Thread1 extends Thread { private SharedObject so;
private int number; public Thread1(SharedObject so, int number) {
this.so = so;
this.number = number;
} public void run() {
String s = so.get(1);
System.out.println("get in thread " + number + ": " + s);
so.put(1, s);
}
}
///////////////
public class Thread2 extends Thread { private SharedObject so;
private int number; public Thread2(SharedObject so, int number) {
this.so = so;
this.number = number;
} public void run() {
String s = so.get(2);
System.out.println("get in thread " + number + ": " + s);
so.put(2, s);
}
}
/////////////
public class SharedObject {
private String contents;
private boolean[] available = new boolean[3]; public synchronized String get(int i) {
while (!available[i]) { // no new contents put by Producer
try {
wait();
} catch (InterruptedException e) {
}
}
available[i] = false;
return contents;
}
public synchronized void put(int i, String value) {
contents = value;
if(i == 0){
available[1] = true;
}else if(i == 1){
available[2] = true;
}else if(i == 2){
available[0] = true;
}
notifyAll();
}
}
先定义消息号,及处理此消息的函数,然后用postmessage函数发消息。
2、在java里定义全局变量,在每个线程里检测全局变量。
protected String message = "";
protected MessageTheadInterface to; public void sendMessage(MessageTheadInterface thread, String message) {
thread.receiveMessage(message);
} public void receiveMessage(String message) {
this.message = message;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public void setToThread(MessageTheadInterface to) {
this.to = to;
}
}public class MyThread
extends MessageTheadInterface
implements Runnable {
Thread self; public MyThread() {
self = new Thread(this);
} public void start() {
self.start();
} public void run() {
System.out.println("a");
sendMessage(to, message);
while (!isStopIt()) {
try {
self.sleep(2000);
}
catch (InterruptedException e) {}
}
} public boolean isStopIt() {
if ("p".equals(message)) {
System.out.println("receive p, end");
return true;
}
return false;
} public static void main(String[] args) {
MyThread a = new MyThread();
MyThreadB b = new MyThreadB();
MyThreadC c = new MyThreadC(); a.setMessage("m");
a.setToThread(b);
b.setToThread(c);
c.setToThread(a); c.start();
b.start();
a.start();
}
}class MyThreadB
extends MessageTheadInterface
implements Runnable {
Thread self; public MyThreadB() {
self = new Thread(this);
} public void start() {
self.start();
} public void run() {
System.out.println("b"); while (!isStopIt()) {
try {
self.sleep(3000);
}
catch (InterruptedException e) {}
}
} public boolean isStopIt() {
if ("m".equals(message)) {
System.out.println("receive m. then send n");
sendMessage(to, "n");
return true;
}
return false;
}
}class MyThreadC
extends MessageTheadInterface
implements Runnable {
Thread self; public MyThreadC() {
self = new Thread(this);
} public void start() {
self.start();
} public void run() {
System.out.println("c"); while (!isStopIt()) {
try {
self.sleep(4000);
}
catch (InterruptedException e) {}
}
} public boolean isStopIt() {
if ("n".equals(message)) {
System.out.println("receive n , then send p");
sendMessage(to, "p"); return true;
}
return false;
}
}