多線程怎麼用?
如何實現多線程
兩種方式:
繼承Thread類,重寫run方法
實現Runnable接口,實現run方法。
啟動線程調用線程的start方法。
如何用多線程來處理一個問題?
每個線程只完成一個數的累積和,(用線程的參數來傳遞指定的數),不要把數組裡面的所有數都進行計算。
你可以傳給線程的時候,除了傳遞輸入輸出數組以外,再傳遞一個index。線程中只處理這個index位置上的數就可以了。
Java線程怎樣使用?
Thread線程類,該類有一個共有的無返回值不帶參數的run方法。
可以用子類繼承Thread類然後重寫run方法。
class T extends Thread{public void run(){while(true){System.out.println("xx"); } 範 }使用是聲明改自定義類對象,調用start方法啟動線程。
Thread t=new T();t.strat();線程啟動執行類中run方法中預製的代碼。
也可以通過實現線程接口Runnable來創建線程
Thread t=new Thread(new Runnable{public void run(){//代碼 }});t.start();
多線程有幾種實現方法
線程建立/執行:
HANDLE Handle1;
DWORD ID1;
Handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ID1);
線程等待:
WaitForSingleObject(Handle1,INFINITE);
線程同步---生產者消費者:
HANDLE m_S_Consumer;
m_S_Consumer = CreateSemaphore(NULL,0,20, NULL);//創建,最多允許有20個產品等待使用,初始0個
ReleaseSemaphore(m_S_Consumer,1,NULL);//生產1個
if(WaitForSingleObject(m_S_Consumer,INFINITE) == WAIT_OBJECT_0){//消費1個
......
}
如何使用線程
java平臺從開始就被設計成為多線程環境。在你的主程序執行的時候,其它作業如碎片收集和事件處理則是在後臺進行的。本質上,你可以認為這些作業是線程。它們正好是系統治理線程,但是無論如何,它們是線程。線程使你能夠定義相互獨立的作業,彼此之間互不干擾。系統將交換這些作業進或出CPU,這樣(從外部看來)它們好象是同時運行的。 在你需要在你的程序中處理多個作業時,你也可以使用多個進程。這些進程可以是你自己創建的,你也可以操縱系統線程。 你進行這些多作業處理,要使用幾個不同的類或接口: java.util.Timer類
javax.swing.Timer類Thread類Runnable接口 對於簡單的作業,通常需要重複的,你可以使用java.util.Timer類告訴它“每半秒鐘做一次”。注重:大多數系統例程是使用毫秒的。半秒鐘是500毫秒。 你希望Timer實現的任務是在java.util.TimerTask實例中定義的,其中運行的方法包含要執行的任務。這些在Hi類中進行了演示,其中字符串“Hi”重複地被顯示在屏幕上,直到你按Enter鍵。 import java.util.*;
public class Hi {
public static void main(String args[])
throws java.io.IOException {
TimerTask task = new TimerTask() {
public void run() {
System.out.PRintln("Hi");}};Timer timer = new Timer();
timer.schedule(task, 0, 500);
System.out.println("Press ENTER to stop");
System.in.read(new byte[10]);
timer.cancel();}} Java Runtime Environment工作的方式是隻要有一個線程在運行,程序就不退出。這樣,當取消被調用,沒有其它線程在運行了,則程序退出。有一些系統線程在運行,如碎片收集程序。這些系統線程也被稱為後臺線程。後臺線程的存在不影響運行環境被關閉,只有非後臺線程保證運行環境不被關閉。 Javax.swing.Timer類與java.util.timer類的工作方式相似,但是有一些差別需要注重。第一,運行的作業被ActionListener接口的實現來定義。第二,作業的執行是在事件處理線程內部進行的,而不象java.util.Timer類是在它的外部。這是很重要的,因為它關係到Swing組件集是如何設計的。 假如你不熟悉Swing,它是一組可以被Java程序使用的圖形組件。Swing被設計程被稱為單線程的。這意味著對Swing類內部內容的訪問必須在單個線程中完成。這個特定的線程是事件處理線程。這樣,例如你想改變Label組件的文字,你不能僅僅調用Jlabel的setText方法。相反,你必須確認setText調用發生在事件處理線程中,而這正是javax.swing.Time類派的上用場的地方。 為了說明這第二種情況,下面的程序顯示一個增加的計數器的值。美半秒鐘計數器的數值增加,並且新的數值被顯示。
C語言如何實現多線程同時運行
使用pthread庫執行多線程,這個是Linux下的線程庫 Windows下應該有自己的API,不過這種東西一般還是以Linux為標準。pthread_create()創建一個線程,傳入fun()的函數指針就行了。
然後這個Beep()的需求要進行線程間通信,可以用共享內存的方法,設一個bool變量flag共享,然後beep的時候設為false,beep完設成true。fun()裡面每次看一下這個flag,是false的話就不做動作等下一秒,基本可以滿足需求。
這樣做的好處是實現簡單,但時間是以1s為單位的。如果要8秒結束立刻執行,需要用條件變量的方法來控制,比較複雜,這樣的實現方式一個可以滿足需求了。
如何在for循環中使用多線程
乾脆把 i 當做參數傳入好了
class Program
{
static int i;
static void Main(string[] args)
{
i = 0;
do
{
new Thread(new ParameterizedThreadStart(s)).Start(i);
i++;
} while (i < 10);
Console.Read();
}
static private void s(object index)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "," + (int)index);
}
}
如何增加多線程的穩定性
微軟官方給出的方案在MSDN裡面有說,就是使用ActiveX EXE那種"單元線程模型".
我也曾經試過,的確可以實現"多線程",只是由於要多一個EXE,比較麻煩,後來就沒有深入了.
結果一次無意中在VBGOOD中看到一段代碼,才打通了一個關節:為什麼不直接使用ActiveX EXE寫程序呢?!
那段代碼裡面,是直接使用這種工程類型,然後在工程內使用CreateObject來生成一個新對象,這樣的話,新的對象就工作於一個單元線程內了.
其實這個我也知道,可是就沒有想到在ActiveX EXE內部使用
看來思路真的不如人.....還要多多學習,多多積累.
ActiveX EXE工程設置為"獨立啟動"後,貌似只能從Sub Main裡進行初始化.
而每個對象的建立,都會調用一次這個過程,因此這個過程需要一次性運行.
但是MSDN裡說得很清楚,在單元線程模型裡面,全局變量的範圍只能是本單元,因此不能使用設置全局變量來完成這個過程的一次運行邏輯.
原代碼裡使用了GetProp等方式,感覺不是很好,於是作了一下改進,使用事件對象來完成此工作.
Sub Main相關代碼如下:
Private Const MyEvent As String = "m5home"
Dim hEvent As Long
Sub Main()
If GetEventHandle = 0 Then '由於每個新對象的建立,都要執行Main()過程,因此使用事件對象來進行判斷.
hEvent = CreateEvent(0&, False, False, MyEvent) '在單元線程下,模塊裡的全局變量已經沒有用了.frmMain.Show
End If
End Sub
Private Function GetEventHandle() As Long
GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)
Call CloseHandle(GetEventHandle)
End Function
Public Function Quit()
Call CloseHandle(hEvent)
End Function
Private Const MyEvent As String = "m5home"
Dim hEvent As Long
Sub Main() If GetEventHandle = 0 Then '由於每個新對象的建立,都要執行Main()過程,因此使用事件對象來進行判斷.
hEvent = CreateEvent(0&, False, False, MyEvent) '在單元線程下,模塊裡的全局變量已經沒有用了.frmMain.Show
End If
End Sub
Private Function GetEventHandle() As Long GetEventHandle = OpenEvent(EVENT_ALL_ACCESS, False, MyEvent)
Call CloseHandle(GetEventHandle)
End Function
Public Function Quit()
Call CloseHandle(hEvent)
End Function
由於事件對象是系統範圍的,因此可......
怎樣用純C寫一個多線程的程序
這是我以前寫的一個多線程範例,湊合看看吧:
#include
#include
#include
using namespace std;
// 提示出租車到達的條件變量
pthread_cond_t taxiCond;
// 同步鎖
pthread_mutex_t taxiMutex;
// 旅客到達等待出租車
void * traveler_arrive(void * name)
{
cout<< " Traveler: " <<(char *)name<< " needs a taxi now! " <
pthread_mutex_lock(&taxiMutex);
pthread_cond_wait (&taxiCond, &taxiMutex);
pthread_mutex_unlock (&taxiMutex);
cout<< " Traveler: " << (char *)name << " now got a taxi! " <
//pthread_exit( (void *)0 );
}
// 出租車到達
void * taxi_arrive(void *name)
{
cout<< " Taxi " <<(char *)name<< " arrives. " <
pthread_cond_signal(&taxiCond);
//pthread_exit( (void *)0 );
}
int main()
{
pthread_t thread;
pthread_attr_t threadAttr;
pthread_attr_init(&threadAttr);
pthread_create(&thread, & threadAttr, taxi_arrive, (void *)( " Jack " ));
sleep(1);
pthread_create(&thread, &threadAttr, traveler_arrive, (void *)( " Susan " ));
sleep(1);
pthread_create(&thread, &threadAttr, taxi_arrive, (void *)( " Mike " ));
sleep(1);
return 0;
}...
線程是什麼,什麼時候使用線程,如何使用線程?
如果用書面語,那你還不如看書呵,還是通俗點。
線程:
舉例:如果你開著QQ,需要和多人進行語音,那麼,你邀請一位朋友進行連接,就需要開闢一條線程,用於保持連接和傳遞數據。它和進程不同,具體的內容可以百度下:線程和進程的區別。
使用:
一般會在同時觸發多項任務時使用線程,比如服務器和客戶端的連接,作為服務器,我需要接受多個客戶端的訪問,每個客戶端的操作又都不一樣,但都需要服務器去處理,那麼作為服務器我會創建專屬於該客戶端的一個連接(一個線程去hold住它),通過互相傳遞指令去執行任務。
創建:
有2種方法:
推薦用:
public class TestRun implements Runnable{ //第一步實現Runnable接口
public TestRun(){
new Thread(this).start(); //第三步啟動線程
}
public void run(){ //第二步實現run方法,該方法為接口中抽象方法
System.out.println("線程體");
}
}