你這個首先得分開。
第一部分:你有很多線程在往數據池裡面寫入數據。那內么,你的線程只管寫容數據,不用理會其他的數據。
第二部分:你的另外的線程(這里可以用spring的job定時器啟動),這部分只管往資料庫寫入數據,至於寫入的條件,你可以判斷數據池的數據是否達到寫入的標准。這里的線程可以配置為啟動一次就一直運行,或者是隔多少秒繼續運行。這樣可以提高效率。
第三部分:數據池,這里的數據池一定要第一部分和第二部分的線程都能夠訪問,並且是唯一的。你可以寫一個公用的類來進行控制。
大致就是這樣的。
2. java多線程共同操作同一個隊列,怎麼實現
以下是兩個線程:
import java.util.*;
public class Thread_List_Operation {
//假設有這么一個隊列
static List list = new LinkedList();
public static void main(String[] args) {
Thread t;
t = new Thread(new T1());
t.start();
t = new Thread(new T2());
t.start();
}
}
//線程T1,用來給list添加新元素
class T1 implements Runnable{
void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "為隊列添加了一個元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}
}
}
//線程T2,用來給list添加新元素
class T2 implements Runnable{
void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "為隊列添加了一個元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}
}
}
//結果(亂序)
Thread-0為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
3. Java向線程傳遞數據的三種方法
在傳統的同步開發模式下 當我們調用一個函數時 通過這個函數的參數將數據傳入 並通過這個函數的返回值來返回最終的計算結果 但在多線程的非同步開發模式下 數據的傳遞和返回和同步開發模式有很大的區別 由於線程的運行和結束是不可預蘆遲料的 因此 在傳遞和返回數據時就無法象函數一樣通過函數參數和return語句來返回數據 本文就以上原因介紹了幾種用於向線程傳遞數據的方法 在下一篇文章中將介紹從線程中返回數據的方法
欲先取之 必先予之 一般在使用線程時都需要有一些初始化數據 然後線程利用這些數據進行加工處理 並返回結果 在這個過程中最先要做的就是向線程中傳遞數據
一 通過構造方法傳遞數據
在創建線程時 必須要建立一個Thread類的或其子類的實例 因此 我們不難想到在調用start方法之前通過線程類的構造方法將數據傳入線程 並將傳入的數據使用類變數保存起來 以便線程使用(其實就是在run方法中使用) 下面的代碼演示了如何通過構造方法來傳遞數據
package mythread;
public class MyThread extends Thread
{
private String name;
public MyThread (String name)
{
this name = name;
}
public void run()
{
System out println( hello + name);
}
public static void main(String[] args)
{
Thread thread = new MyThread ( world );
thread start();
}
}
由於這種方法是在創建線程對象的同時傳遞數據的 因此 在線程運行之前這些數據就就已經到位了 這樣就不會造成數據在線程運行後才傳入的現象 如果要傳遞更復雜的數據 可以使用集合 類等數據結構 使用構造方法來傳遞數據雖然比較安全 但如果要傳遞的數據比較多時 就會造成很多不便 由於Java沒有默認參數 要想實現類似默認參數的效果 就得使用重載 這樣不但使構造方法本身過於復雜 又會使構造方法在數量上大增 因此 要想避免這種情況 就得通過類方法或類變數來傳遞數據
二 通過變數和方法傳遞數據
向對象中傳入數據一般有兩次機會 第一次機會是在建立對象時通過構造方法將數據傳入 另外一次機會就是在類中定義一系列的public的方法或變數(也可稱之譽裂為欄位) 然後在建立完對象後 通過對象實例逐個賦值 下面的代碼是對MyThread 類的改版 使用了一個setName方法來設置name變數
package mythread;
public class MyThread implements Runnable
{
private String name;
public void setName(String name)
{
this name = name;
}
public void run()
{
System out println( hello + name);
}
public static void main(String[] args)
{
MyThread myThread = new MyThread ();
myThread setName( world );
Thread thread = new Thread(myThread);
thread start();
}
}
三 通過回調函數傳遞數據
上面討論的兩種向慶嘩閉線程中傳遞數據的方法是最常用的 但這兩種方法都是main方法中主動將數據傳入線程類的 這對於線程來說 是被動接收這些數據的 然而 在有些應用中需要在線程運行的過程中動態地獲取數據 如在下面代碼的run方法中產生了 個隨機數 然後通過Work類的process方法求這三個隨機數的和 並通過Data類的value將結果返回 從這個例子可以看出 在返回value之前 必須要得到三個隨機數 也就是說 這個value是無法事先就傳入線程類的
package mythread;
class Data
{
public int value = ;
}
class Work
{
public void process(Data data Integer numbers)
{
for (int n : numbers)
{
data value += n;
}
}
}
public class MyThread extends Thread
{
private Work work;
public MyThread (Work work)
{
this work = work;
}
public void run()
{
java util Random random = new java util Random();
Data data = new Data();
int n = random nextInt( );
int n = random nextInt( );
int n = random nextInt( );
work process(data n n n ); // 使用回調函數
System out println(String valueOf(n ) + + + String valueOf(n ) + +
+ String valueOf(n ) + = + data value);
}
public static void main(String[] args)
{
Thread thread = new MyThread (new Work());
thread start();
}
}
lishixin/Article/program/Java/hx/201311/26623
4. java中怎麼用多個線程同時對一個文件讀取,最終將文件內容保存到一個位元組數組中去呢
多線程復讀取文件在一塊硬碟上沒制用,瓶頸在硬碟I/O,而不在CPU和內存。讀取文件時,CPU不用復雜的計算工作,只是數據傳輸而已,多線程反而造成磁頭來回移動,效率不高。如果是兩塊以上的硬碟,可以用不同的線程訪問不同的硬碟,效率比單線程要高
而且多線程操作同一文件除了效率還會有多線程問題,多個線程同時往數組里存數據還會有線程安全問題,如果不同步處理讀取的文件就是錯誤的。
如果讀取的話只能設置每個線程各自讀取偏 移量
讀取文件大小(比如大小是200K)。 2,啟動5個線程,第一個線程讀到40,第二個線程跳過40在讀到80,總之得合理安排好各個線程讀取的大小。這樣才能不重復讀取。大數據處理框架maprece原理和此類似
5. Java 多線程處理一個List
多線程並發操作,
請使用Collections.synchronizedList(new LinkedList<String>());
這樣就是線程安全
另外LinkedList插入快內
再次就是啟動jvm的參數容設置
-Xms512m Xmx1024m