2011-09-05 48 views
3

我正在编写一个多线程应用程序,它有几个线程(大约25个),每个线程执行一个特定的进程,然后更新数据库,然后给下一个线程处理另一个线程的权限过程和做同样的事情。基本上,线程1进程然后更新数据库为完成,然后当线程二读取数据库完成它开始处理和过程继续,直到线程25.任何人都知道这是如何在Java中可能?多线程与数据库(mysql或oracle)

+0

如果要让所有线程顺序执行,为什么首先使用多个线程?只使用一个线程。 –

回答

1

您可以在每个线程中使用简单的逻辑检索数据(使用select查询),但为了更新数据,建议在同步块中执行查询。由于其他线程依赖于此线程正在修改的数据,因此在获取记录时可能会导致问题。

0

为什么25呢?

无论如何,你所说的肯定是可能的,但你可能想创建一个特殊的线程,获得每个线程计算出来的结果值并将其提交给数据库。

这样你需要有一个线程可以访问数据库,其他所有线程都不必等待数据库。

-1

我不知道我完全得到你的要求,但在这里是一个高层次的算法:

  1. 创建所需数量的线程,并把它们放入数组。

  2. 现在从第二个线程开始到最后一个,每个线程必须在前一个线程上执行join();这将有助于每个负责人在完成之前运行它的处理和更新部分。

可能的代码:

Thread类声明

class WaitingThread extends Thread 
{  
    private Thread previousThread; 

    public WaitingThread(final Thread previous) 
    { 
     this.previousThread = previous; 
    } 

    public void run() 
    { 
     doParallelTask(); 

     if(previousThread != null) 
     { 
      previousThread.join(); 
     } 

     doProcesingAndUpdating(); 
    } 
} 

阵列声明和初始化;

final Thread [] threads = new Thread[25]; 

    for(int i = 0; i < 25; i++) 
    { 
     if(i == 0) 
     { 
      threads[i] = new WaitinThread(null); 
     } 
     else 
     { 
      threads[i] = new WaitingThread(threads[i - 1]); 
     } 
    } 

希望这会有所帮助。

PS:我必须承认,在上述模型中,使用多线程执行doParallelTask()以及使用单个线程执行该操作更有意义。

+0

Downvoter,关心评论? –

1

你提的问题是非常一般,但我会采取的做法是这样的:

  1. 指定一个线程中控制器线程。这是工作是听取工作线程完成他们的处理。做最简单的方法是用信号对象和wait/notify方式 - 控制器线程将采取对信号锁,然后调用wait

  2. 创建工人线程,每个线程对,每个线程需要的锁,并再次调用wait自己的信号对象。

  3. 触发以开始处理(这可能是运行应用程序时,用户点击一个按钮,等等)获得控制器旗语上的锁,并调用notify针对它唤醒控制器线。 控制器的工作是从池中选择一个工作线程,获得其信号量的锁和呼叫notify使工人清醒。 控制器然后自己调用wait信号量

  4. 那么工人线程可以读取数据库,做了处理,并写回数据库它控制器信号上呼吁notify之前与控制器导致进程重新启动针对其自己的工作人员其中一个线程的*信号*和wait调用notify

最后提醒一句,这是实现你所描述的一般行为有什么需要的一个非常简短的提纲。线程可能是计算机科学中最被误解的主题,非常容易出错。在跳入多线程系统之前,请确保至少您已阅读Brian Goatz's - Java Concurrency In Practice