有个applet,写了200多行(我承认写的很烂)
而且为了实现功能,需要开3个线程。我有3个问题:
问题1.是否非要开3个线程。
我的功能是画进度指示条的同时做下载,原以为2个线程就够,可后来发现光画动态图就需要2个啊!public class Appmain extends Applet implements Runnable{
//
public void start(){
while(true){
repaint();// 重新画图
}
}
public void paint(Graphics g) {
//画图
}
}如程序注释,在循环里用repait()重画图,结果发现repaint()只有在paint()运行了之后才能执行,而paint()要在start()之后执行,所有写在这里就阻塞了。
所以我只能在start()里面再起一个线程,把repait()写在新线程的run()里面。
请问有没有什么办法能在一个线程里实现循环repait()?
问题2.如果把这个大类200多行,分写成2个100行的小类,A,B
然后A开2个线程(因为applet动态画图的缘故),B开一个线程。
这样 一个200行的对象开3个线程 vs 2个100行的对象开3个线程。在内存和cpu上有没有优化? 即 200×3 vs 100×2+100
问题3.如果按问题2那样分2个100行小类,分别开线程,如何实现线程间通讯?
比如我想在类B的线程中,改变类A那个线程中的成员变量,该怎么写呢?谢谢!
而且为了实现功能,需要开3个线程。我有3个问题:
问题1.是否非要开3个线程。
我的功能是画进度指示条的同时做下载,原以为2个线程就够,可后来发现光画动态图就需要2个啊!public class Appmain extends Applet implements Runnable{
//
public void start(){
while(true){
repaint();// 重新画图
}
}
public void paint(Graphics g) {
//画图
}
}如程序注释,在循环里用repait()重画图,结果发现repaint()只有在paint()运行了之后才能执行,而paint()要在start()之后执行,所有写在这里就阻塞了。
所以我只能在start()里面再起一个线程,把repait()写在新线程的run()里面。
请问有没有什么办法能在一个线程里实现循环repait()?
问题2.如果把这个大类200多行,分写成2个100行的小类,A,B
然后A开2个线程(因为applet动态画图的缘故),B开一个线程。
这样 一个200行的对象开3个线程 vs 2个100行的对象开3个线程。在内存和cpu上有没有优化? 即 200×3 vs 100×2+100
问题3.如果按问题2那样分2个100行小类,分别开线程,如何实现线程间通讯?
比如我想在类B的线程中,改变类A那个线程中的成员变量,该怎么写呢?谢谢!
public class Clock extends java.applet.Applet implements Runnable {// 实现接口
private static final long serialVersionUID = 1L;
Thread clockThread;
int i = 0; public void start() {
if (clockThread == null) {
clockThread = new Thread(this, "Clock");
clockThread.start(); // 启动线程
}
} public void run() { // run()方法中是线程执行的内容
while (i++<100) {
repaint(); // 刷新显示i
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public void paint(Graphics g) {
g.drawString("i= "+i,5, 10);
}
}
public class Clock extends java.applet.Applet implements Runnable {// 实现接口
private static final long serialVersionUID = 1L;
Thread clockThread;
Thread stopThread;
int i = 0;
boolean stop = false;
public void start() {
if (clockThread == null) {
clockThread = new Thread(this, "clock");
clockThread.start(); // 启动线程
}
if(stopThread==null){
stopThread = new Thread(new StopClock(),"stop");
stopThread.start();
}
}
public void run() { // run()方法中是线程执行的内容
while (i++<100&&!stop) { //stop不是true就继续,直到100
repaint(); // 刷新显示i
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void paint(Graphics g) {
g.drawString("i= "+i,5, 10);
}
public void setStop(boolean s){
stop = s;
}
}//---stop的类
public class StopClock implements Runnable {
public void run() {
// 这里我不会写!如何将Clock线程中的stop置为true
}
}问题在于无法获得clock那个线程的Clock对象,如果把stop 改成static类型的是可以做到的,但那样一个全局变量会对applet使用带来影响,比如刷新页面,static值不变。 请问有什么办法么?
public class Clock3 extends java.applet.Applet implements Runnable {
private static final long serialVersionUID = 1L;
Thread myThread1;
Thread myThread2;
public void start() { // 启动2个功能的线程
if (myThread1 == null) {
myThread1 = new Thread(this, "Clock");
myThread1.start();
}
if(myThread2==null){
myThread2 = new Thread(this,"stop");
myThread2.start();
}
}
public void run() {
if(Thread.currentThread().getName()=="Clock"){
runClock();
}else if(Thread.currentThread().getName()=="stop"){
runStop();
}
}
public void runClock(){
//100行代码
}
public void runStop(){
//100行代码
}
(未完待续)