導航:首頁 > 網路營銷 > java多線程semt

java多線程semt

發布時間:2020-09-01 22:52:15

1、在java中單線程和多線程是什麼意思,他們有什麼區別,分別的作用是什麼?

在一個程序中,這些獨立運行的程序片斷叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然後程序會立即作出響應,而不是讓用戶等待程序完成了當前任務以後才開始響應。簡單地說,就是說可以有多個任務同時進行。
單線程在程序執行時,所走的程序路徑按照連續順序排下來,前面的必須處理好,後面的才會執行。因此,針對前面舉的例子,必須等待程序完成了當前任務以後才能開始相應。

使用多線程訪問公共的資源時,容易引發線程安全性問題,因此針對這種需要使用線程同步機制來保護公共的資源。
單線程較多線程來說,就不會出現上訴問題,系統穩定、擴展性極強、軟體豐富。多用於點對點的服務。

2、java 多線程是什麼?

進程是程序在處理機中的一次運行。一個進程既包括其所要執行的指令,也包括了執行指令所需的系統資源,不同進程所佔用的系統資源相對獨立。所以進程是重量級的任務,它們之間的通信和轉換都需要操作系統付出較大的開銷。
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位。線程自己基本上不擁有系統資源,但它可以與同屬一個進程的其他線程共享進程所擁有的全部資源。所以線程是輕量級的任務,它們之間的通信和轉換只需要較小的系統開銷。
Java支持多線程編程,因此用Java編寫的應用程序可以同時執行多個任務。Java的多線程機制使用起來非常方便,用戶只需關注程序細節的實現,而不用擔心後台的多任務系統。
Java語言里,線程表現為線程類。Thread線程類封裝了所有需要的線程操作控制。在設計程序時,必須很清晰地區分開線程對象和運行線程,可以將線程對象看作是運行線程的控制面板。在線程對象里有很多方法來控制一個線程是否運行,睡眠,掛起或停止。線程類是控制線程行為的唯一的手段。一旦一個Java程序啟動後,就已經有一個線程在運行。可通過調用Thread.currentThread方法來查看當前運行的是哪一個線程。

class ThreadTest{
public static void main(String args[]){
Thread t = Thread.currentThread();
t.setName("單線程"); //對線程取名為"單線程"
t.setPriority(8);
//設置線程優先順序為8,最高為10,最低為1,默認為5
System.out.println("The running thread: " + t);
// 顯示線程信息
try{
for(int i=0;i<3;i++){
System.out.println("Sleep time " + i);
Thread.sleep(100); // 睡眠100毫秒
}
}catch(InterruptedException e){// 捕獲異常
System.out.println("thread has wrong");
}
}
}

多線程的實現方法
繼承Thread類
可通過繼承Thread類並重寫其中的run()方法來定義線程體以實現線程的具體行為,然後創建該子類的對象以創建線程。
在繼承Thread類的子類ThreadSubclassName中重寫run()方法來定義線程體的一般格式為:
public class ThreadSubclassName extends Thread{
public ThreadSubclassName(){
..... // 編寫子類的構造方法,可預設
}
public void run(){
..... // 編寫自己的線程代碼
}
}
用定義的線程子類ThreadSubclassName創建線程對象的一般格式為:
ThreadSubclassName ThreadObject =
new ThreadSubclassName();
然後,就可啟動該線程對象表示的線程:
ThreadObject.start(); //啟動線程

應用繼承類Thread的方法實現多線程的程序。本程序創建了三個單獨的線程,它們分別列印自己的「Hello World!」。
class ThreadDemo extends Thread{
private String whoami;
private int delay;
public ThreadDemo(String s,int d){
whoami=s;
delay=d;
}
public void run(){
try{
sleep(delay);
}catch(InterruptedException e){ }
System.out.println("Hello World!" + whoami
+ " " + delay);
}
}
public class MultiThread{
public static void main(String args[]){
ThreadDemo t1,t2,t3;
t1 = new ThreadDemo("Thread1",
(int)(Math.random()*2000));
t2 = new ThreadDemo("Thread2",
(int)(Math.random()*2000));
t3 = new ThreadDemo("Thread3",
(int)(Math.random()*2000));
t1.start();
t2.start();
t3.start();
}
}

實現Runnable介面
編寫多線程程序的另一種的方法是實現Runnable介面。在一個類中實現Runnable介面(以後稱實現Runnable介面的類為Runnable類),並在該類中定義run()方法,然後用帶有Runnable參數的Thread類構造方法創建線程。
創建線程對象可用下面的兩個步驟來完成:
(1)生成Runnable類ClassName的對象
ClassName RunnableObject = new ClassName();
(2)用帶有Runnable參數的Thread類構造方法創建線程對象。新創建的線程的指針將指向Runnable類的實例。用該Runnable類的實例為線程提供 run()方法---線程體。
Thread ThreadObject = new Thread(RunnableObject);
然後,就可啟動線程對象ThreadObject表示的線程:
ThreadObject.start();
在Thread類中帶有Runnable介面的構造方法有:
public Thread(Runnable target);
public Thread(Runnable target, String name);
public Thread(String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,Runnable target,
String name);
其中,參數Runnable target表示該線程執行時運行target的run()方法,String name以指定名字構造線程,ThreadGroup group表示創建線程組。
用Runnable介面實現的多線程。
class TwoThread implements Runnable{
TwoThread(){
Thread t1 = Thread.currentThread();
t1.setName("第一主線程");
System.out.println("正在運行的線程: " + t1);
Thread t2 = new Thread(this,"第二線程");
System.out.println("創建第二線程");
t2.start();
try{
System.out.println("第一線程休眠");
Thread.sleep(3000);
}catch(InterruptedException e){
System.out.println("第一線程有錯");
}
System.out.println("第一線程退出");
}
public void run(){
try{
for(int i = 0;i < 5;i++){
System.out.println(「第二線程的休眠時間:」
+ i);
Thread.sleep(1000);
}
}catch(InterruptedException e){
System.out.println("線程有錯");
}
System.out.println("第二線程退出");
}
public static void main(String args[]){
new TwoThread();
}
}
程序運行結果如下:
正在運行的線程: Thread[第一主線程,5,main
創建第二線程
第一線程休眠
第二線程的休眠時間:0
第二線程的休眠時間:1
第二線程的休眠時間:2
第一線程退出
第二線程的休眠時間:3
第二線程的休眠時間:4
第二線程退出

3、java中怎樣實現多線程

//簡單的演示,四個人吃包子,各吃各的!
public class ThreadTest {
public static void main(String[] args) {
String[] arr = { "張333", "李----四", "-----王五", "趙六666" };
for (int i = 0; i < 4; i++) {
new Thread(new Runnable() {
int a = 1;
public void run() {
while(a<100)
System.out.println(Thread.currentThread().getName() + "在吃包子,吃了" + (a++) + "個了");
}
}, arr[i]) {
}.start();
}
}
}

4、JAVA中如何利用多線程同時運行多個方法?

首先,這個同時,只是在宏觀上的,多線程環境,線程與線程之間,還是串列運行的。
要「同時」運行多個方法,那麼,就需要創建多個線程,然後,在線程的run()方法里,寫上你想要實現的邏輯。需如果創建多線程,這又是另一個問題(通過繼承Thread跟實現Runnable來實現)。

5、java多線程怎麼測試

在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另外一種是實現Runable介面。
對於直接繼承Thread的類來說,代碼大致框架是:
class 類名 extends Thread{
方法1;
方法2;

public void run(){
// other code…
}
屬性1;
屬性2;


}

先看一個簡單的例子:

/**
* @author Rollen-Holt 繼承Thread類,直接調用run方法
* */
class hello extends Thread {

public hello() {

}

public hello(String name) {
this.name = name;
}

public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + "運行 " + i);
}
}

public static void main(String[] args) {
hello h1=new hello("A");
hello h2=new hello("B");
h1.run();
h2.run();
}

private String name;
}

【運行結果】:
A運行 0
A運行 1
A運行 2
A運行 3
A運行 4
B運行 0
B運行 1
B運行 2
B運行 3
B運行 4
我們會發現這些都是順序執行的,說明我們的調用方法不對,應該調用的是start()方法。
當我們把上面的主函數修改為如下所示的時候:
public static void main(String[] args) {
hello h1=new hello("A");
hello h2=new hello("B");
h1.start();
h2.start();
}

然後運行程序,輸出的可能的結果如下:
A運行 0
B運行 0
B運行 1
B運行 2
B運行 3
B運行 4
A運行 1
A運行 2
A運行 3
A運行 4
因為需要用到CPU的資源,所以每次的運行結果基本是都不一樣的,呵呵。
注意:雖然我們在這里調用的是start()方法,但是實際上調用的還是run()方法的主體。
那麼:為什麼我們不能直接調用run()方法呢?
我的理解是:線程的運行需要本地操作系統的支持。
如果你查看start的源代碼的時候,會發現:
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0 || this != me)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();

注意我用紅色加粗的那一條語句,說明此處調用的是start0()。並且這個這個方法用了native關鍵字,次關鍵字表示調用本地操作系統的函數。因為多線程的實現需要本地操作系統的支持。
但是start方法重復調用的話,會出現java.lang.IllegalThreadStateException異常。
通過實現Runnable介面:

大致框架是:
class 類名 implements Runnable{
方法1;
方法2;

public void run(){
// other code…
}
屬性1;
屬性2;


}

6、java如何多線程並發執行?

是不是在public void run(){}方法裡面執行
for(int j=0;j<list.size;j++){
check(list.get(j))
}啊,如果不是還請告知怎麼弄,我就是想實現非同步,在調用方法之後可以立即去執行別的操作而不需要等裡面東西運行完,至於是不是多線程都不在乎。多謝了

就是你說的這樣

7、Java多線程是什麼意思?

Java多線程實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。

1、繼承Thread類實現多線程
繼承Thread類的方法盡管被我列為一種多線程實現方式,但Thread本質上也是實現了Runnable介面的一個實例,它代表一個線程的實例,並且,啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。例如:

在合適的地方啟動線程如下:

2、實現Runnable介面方式實現多線程
如果自己的類已經extends另一個類,就無法直接extends Thread,此時,必須實現一個Runnable介面,如下:

為了啟動MyThread,需要首先實例化一個Thread,並傳入自己的MyThread實例:

事實上,當傳入一個Runnable target參數給Thread後,Thread的run()方法就會調用target.run(),參考JDK源代碼:

3、使用ExecutorService、Callable、Future實現有返回結果的多線程
ExecutorService、Callable、Future這個對象實際上都是屬於Executor框架中的功能類。想要詳細了解Executor框架的可以訪問http://www.javaeye.com/topic/366591 ,這裡面對該框架做了很詳細的解釋。返回結果的線程是在JDK1.5中引入的新特徵,確實很實用,有了這種特徵我就不需要再為了得到返回值而大費周折了,而且即便實現了也可能漏洞百出。
可返回值的任務必須實現Callable介面,類似的,無返回值的任務必須Runnable介面。執行Callable任務後,可以獲取一個Future的對象,在該對象上調用get就可以獲取到Callable任務返回的Object了,再結合線程池介面ExecutorService就可以實現傳說中有返回結果的多線程了。下面提供了一個完整的有返回結果的多線程測試例子,在JDK1.5下驗證過沒問題可以直接使用。代碼如下:

代碼說明:
上述代碼中Executors類,提供了一系列工廠方法用於創先線程池,返回的線程池都實現了ExecutorService介面。
public static ExecutorService newFixedThreadPool(int nThreads) 
創建固定數目線程的線程池。
public static ExecutorService newCachedThreadPool() 
創建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鍾未被使用的線程。
public static ExecutorService newSingleThreadExecutor() 
創建一個單線程化的Executor。
public static ScheledExecutorService newScheledThreadPool(int corePoolSize) 
創建一個支持定時及周期性的任務執行的線程池,多數情況下可用來替代Timer類。

總結:ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor後台線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。

8、Java 多線程與for 語句如何結合使用?

public class TestThread implements Runnable{
String param = null;

public TestThread(String param) {
this.param = param;
}

@Override
public void run() {
System.out.println(param);

}

public static void main(String[] args) {
while(true) {
new Thread(new TestThread("測試")).start();
}
}
}

給你寫了個簡單的demo,就是把你需要的參數寫在你的類裡面,然後用構造注入就可以了

9、java用多線程實現累加求和

在樓上基礎上大概改一下,增加同步處理。
public class Test extends Thread {
static int n = 0;
private int startNum = 0 ;
public Test (int sn)
{
this.startNum = sn ;
}
public static synchronized void addSum (int num)
{
n += num ;
}
public static void main(String[] args) {
Thread [] thList = new Thread [10] ;
for (int i = 0; i < 10; i ++) {
thList [i] = new Test(i * 10 + 1) ;
thList [i].start();
}
for (int i = 0 ; i < 10 ; i ++)
{
thList [i].join () ;
}
System.out.println ("Sum is : " + n) ;
}

public void run() {
int sum = 0 ;
for (int i = 0; i < 10; ++i) {
sum += sn + i ;
}
addSum (sum) ;
}
}

10、如何用Java編寫多線程

//兩種方式

public class ThreadDemo extends Thread{
    public void run(){
        System.out.println("線程"+Thread.currentThread().getName());
    }
    public static void main(String[] args){
        ThreadDemo t1 = new ThreadDemo();//創建線程
        t1.start();//啟動線程
        
        //創建第二個線程
        ThreadDemo t2 = new ThreadDemo();//創建線程
        t2.start();//啟動線程
    }
}

//方式二,實現Runnable介面

public class ThreadDemo implements Runnable{
    public void run(){
        System.out.println("線程"+Thread.currentThread().getName());
    }
    public static void main(String[] args){
        //創建線程實例
        ThreadDemo td = new ThreadDemo()
        //創建線程1
        Thread t1 = new Thread(td);
        t1.start();  
        //創建線程2
        Thread t2 = new Thread(td);
        t2.start();  
    }
}

與java多線程semt相關的知識