Topic: 【求助】请教几个关于线程的问题

  Print this page

1.【求助】请教几个关于线程的问题 Copy to clipboard
Posted by: Cappuccino
Posted on: 2007-05-31 15:27

刚开始学java没多久,想请教一下各位几个关于多线程的问题。谢谢了。
1. 线程类里面的run方法是void的类型,如果有的时候需要返回值的话有什么好办法呢?现在只知道两个办法一个是将thread当作内部类,然后访问外部类的资源;还有一个是将调用的类当作参数构建thread,让thread来访问调用类里面的资源。
2. 关于线程池里面的概念,知道jdk里面有一个cocurrent的包,但是貌似在网上讨论的不多,如果各位有什么关于这个的好的文章劳驾推荐一下,万分感谢。
3. 我自己写了一个ThreadPool类进行多线程的操作,用来生成workerthread。但是运行的时候经常会变成像死锁一样,不知道原因是什么。是因为没有强制停止workerthread吗?threadpool代码如下


package test;
import java.util.LinkedList;

public class ThreadPool
{
  private final int nThreads;

  private final PoolWorker[] threads;

  private final LinkedList<Runnable> queue;

  public ThreadPool(int nThreads)
  {
    this.nThreads = nThreads;
    queue = new LinkedList<Runnable>();
    threads = new PoolWorker[this.nThreads];

    for (int i = 0; i < this.nThreads; i++)
    {
      threads[i] = new PoolWorker();
      threads[i].start();
    }
  }

  public void execute(Runnable r)
  {
    synchronized (queue)
    {
      queue.addLast(r);
      queue.notifyAll();
    }
  }

  private class PoolWorker extends Thread
  {
    public void run()
    {
      Runnable r;

//      while (true)
//      {
        synchronized (queue)
        {
          while (queue.isEmpty())
          {
            try
            {
              queue.wait();
            } catch (InterruptedException ignored)
            {
            }
          }

          r = (Runnable) queue.removeFirst();
        }

        try
        {
          r.run();
        } catch (RuntimeException e)
        {
        }
//      }
    }
  }
}


2.Re:【求助】请教几个关于线程的问题 [Re: Cappuccino] Copy to clipboard
Posted by: cxp108
Posted on: 2007-06-04 12:25

1.线程同时也是个对象,你可以自己写几个Getter或Setter,来获取你需要的线程中的数据。不要在你的代码中调用Thread.run(),这很危险。

2.Concurrent包中的容器都是线程安全的,也就是说:当两个线程同时要使用一个容器时,容器会自动安排先后(也就是互斥),不会出现异常。同时Concurrent包中的类有针对多线程环境进行加强,优化了并发存取的性能。

3.存在

catch (RuntimeException e)
{
}



catch (InterruptedException ignored)
{
}

这样的代码的话,你永远都不会知道有什么问题。

3.Re:【求助】请教几个关于线程的问题 [Re: cxp108] Copy to clipboard
Posted by: Cappuccino
Posted on: 2007-06-07 00:45

cxp108 wrote:
1.线程同时也是个对象,你可以自己写几个Getter或Setter,来获取你需要的线程中的数据。不要在你的代码中调用Thread.run(),这很危险。

2.Concurrent包中的容器都是线程安全的,也就是说:当两个线程同时要使用一个容器时,容器会自动安排先后(也就是互斥),不会出现异常。同时Concurrent包中的类有针对多线程环境进行加强,优化了并发存取的性能。

3.存在

catch (RuntimeException e)
{
}



catch (InterruptedException ignored)
{
}

这样的代码的话,你永远都不会知道有什么问题。


1和3多谢指教了,2的我再去找找其他的资料看看^_^


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923