我是JAVA新手.
目前需要在主线程下再开一个线程,执行后台数据库操作,执行成功与否以事件的形式通知主线程.
请问,主线程如何接收子线程传来的结果(不需要象书里说的用到管道吧),还有如何以事件的方式通知主线程?我看了些资料有写到
CALLBACK机制,不过没有相关例子.请大家帮忙

解决方案 »

  1.   

    可以参考VC的CALLBACK例子,你不可能是直接从其他过到JAVA来的吧
      

  2.   

    下面是个例子,其实和C++里的回调是一样的,只是语法不一样,导致表现形式不一样。public class ThreadSample implements IFinish
    {
    public void finish(String strMessage)
    {
    System.out.println(strMessage);
    }

    public static void main(String[] args)
    {
    ThreadSample sample = new ThreadSample();

    WorkThread thread = new WorkThread(sample);
    thread.start();

    }}interface IFinish
    {
    public void finish(String strMessage);
    }class WorkThread extends Thread
    {
    private IFinish callback = null; 
    public WorkThread(IFinish callback)
    {
    this.callback = callback;
    }
    public void run()
    {
    try
    {
    Thread.sleep(5000);
    }
    catch (InterruptedException e)
    {
    System.out.println("thread interrupted.");
    }

    callback.finish("mission accomplished.");

    }
    }
      

  3.   

    其实楼主可以看看Comparator这个类的用法,它是排序用的,是Java中一个很好的回调的例子。
      

  4.   

    主线程,子线程,暂且这样说, 子线程要访数据库, 并返回结果, 这里有个问题, 1.区子线程访问数据库后返回来的结果都只是主线程用的吗? 
    2.子线程是不断访问数据库,不断返回结果, 还是访问,返回,直到主线程获得返回结果后再度访问???其实用生产者消费者模式可以很好解决这个问题. I think!
      

  5.   

    1主线程伦询
    2callback机制,子线程执行后调用主线程的方法
    3wait,notify机制
      

  6.   

    谢谢大家的热心!
    to : hfree()  
    子线程只是每隔一段时间执行一次更新数据库的功能,主线程无需用到子线程的结果集,只要知道成功与否即可。成功就OK,不成功就要把错误信息写入日志了。
      

  7.   

    参考下:Observable/ observer 的源代码
      

  8.   

    to: yanxiazhiqiu
    不是,主线程里的函数启动完子线程后就返回了,子线程里的功能每隔一定周期执行依次,每次执行的结果需要事件的方式通知主线程谢谢蓝色的猪,我去看一下DOC
      

  9.   

    to: 卢兄
    我这两天一直在看JAVA线程编程,等我弄清楚些马上结贴
    顺便问卢兄一个问题:
    如果想通过EVENT通知主线程的ACTIONLISTENER该如何实现.比如子线程如果出错就触发一个自定义的EVENT通知主线程,让主线程知道
    谢谢
      

  10.   

    TO:卢兄
    谢谢你的例子,帮了我不少忙
    我结合网的文章,实现了需要的功能/*Java 的接口支持提供了一种获得回调的等价功能的机制。
      其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。
    */
     interface InterestingEvent
     {
        // 这仅是一个常规方法。因此如果需要,它可有返回值,也可接收参数。
        public void interestingEvent ();
     }
     
     //发出事件信号的类必须等待实现了 InterestingEvent 接口的对象,并在适当时候调用interestingEvent() 方法
     class EventNotifier
     {
       private SpecialEvent ie;
       public EventNotifier (SpecialEvent event)
       {
         // 保存事件对象以备后用。
         ie = event;
       }
       public void doWork ()
       {
          bool successful;
          try{
            successful=doDatabaseOperation();
          }
          catch(...)
          {
             ...
          }
          if(successful)
            ie.interestingEvent();   
              
        }
      }
      

  11.   

    //构造函数打错了,应该是interestingEvent 
    public EventNotifier (interestingEvent event)
       {
         // 保存事件对象以备后用。
         ie = event;
       }
    //然后是调用的主类
    public class CallMe implements interestingEvent
    {
      private EventNotifier en;
      private int i = 0;
      public CallMe ()
      {
        // 创建事件通知程序,并将自身引用传递给它。
        en = new EventNotifier (this);
      }
      // 为事件定义实际的处理程序。
      public void interestingEvent ()
      { 
        // 噢!必定发生了感兴趣的事件!
        // 执行某些操作 ...
        System.out.println("right,it Happened");
        
      }
       public static void main(String[] args) {
        CallMe x = new CallMe();
        x.en.doWork();
         
         
       }}