有个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那个线程中的成员变量,该怎么写呢?谢谢!

解决方案 »

  1.   

    有必要 while(true) 吗?使用 wait / notify 
      

  2.   

    我先把第一个问题重新描述下,就是下面这个代码,有没有办法只用一个线程实现?import java.awt.Graphics;
    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);
    }
    }
      

  3.   

    我再说明下第三个问题,关于线程间通讯,如下代码,如何在stop线程中设置clock线程的变量stop值?import java.awt.Graphics;
    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值不变。 请问有什么办法么?
      

  4.   

    还有第二个问题:对2个功能各开一个线程,如下2中写法,请问在时间和空间效率上有什么不同么?//方法1,2个功能写在一个类中,开2个线程
    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行代码
    }
    (未完待续)