JAVA多線程的學習筆記

第一次在開源中國上發博文,簡單的把之前在達內培訓JAVA時的一篇日誌複製共享一下。 java

 

多進程(多任務)- 針對OS

多線程(Thread) - 一個進程內部的多任務

java語言(JVM)支持多線程編程

java.lang.Thread
Thread類由JDK提供,用於封裝對JVM中線程的控制,調用C語言的類庫實現。
一、建立一個線程
JVM會建立默認的線程 main用於運行main方法。
程序員能夠建立本身定義的線程(定義線程的運行體)
-------------------------------------
public class MyThread extends Thread {
//重寫Thread的run方法
//用於指定線程的運行體
@Override
public void run(){
//super.run();
for(int i=0;i<100000;i++){
System.out.println("run"+i);
}
}
}
**************************
public class TestThread {
public static void main(String[] args) {
Thread t=new MyThread();
t.start();//啓動一個線程,即時返回
      //t.run();//調用方法
for(int i=0;i<100000;i++){
System.out.println("main"+i);
}
}
}
-----------------------------------
Thread.sleep(long l);
做用:讓當前線程(運行該方法的線程)「掛起」sleep

public class MyThread extends Thread {
//重寫Thread的run方法
//用於指定線程的運行體
@Override
public void run(){
//super.run();
for(int i=0;i<100000;i++){
try{
Thread.sleep(100);
}catch(InterruptedException ee){
}
System.out.println("run"+i);
}
}
}
****************************
public class TestThread {
public static void main(String[] args) throws InterruptedException {
Thread t=new MyThread();
t.start();//啓動一個線程
for(int i=0;i<100000;i++){
         Thread.sleep(200);
System.out.println("main"+i);
}
}
}
------------------------------------------
day2
(1)、進程中的多任務
(2)、MyThread extends Thread{
  //指定線程的運行體
  public void run(){...}
}
  Thread t = new MyThread();
  t.start();

Thread.sleep();//讓當前線程掛起
(3)、線程的狀態及其轉換
        block-->running-->ready--->running

(4)、守護線程
  經過setDaemon方法,能夠設置線程爲守護線程。JVM若是發現當前的線程所有是守護線程時,就退出。
import java.util.Date;

public class MyThread extends Thread {
// 重寫Thread的run方法
// 用於指定線程的運行體
@Override
public void run() {
while (true) {
System.out.println(new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
*****************************
import java.io.IOException;

public class Main {
public static void main(String[] args) throws IOException {
Thread t=new MyThread();
//設置爲守護線程,默認爲fales;
t.setDaemon(true);
t.start();
System.out.println("Main");
System.in.read();
}
}
(5)、Runnable接口
方法1)、Thread t = new MyThread();
     //MyThread 是Thread的子類

小程序(麻煩的例子,非Runnable例子)
public class MyThread extends Thread {
private NameList nameList;
public MyThread(NameList nameList){
this.nameList=nameList;
}
// 重寫Thread的run方法
// 用於指定線程的運行體
@Override
public void run() {
while (true) {
try {
//打印集合中的內容
nameList.printNames();
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
}
}
*****************************
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class NameList {
private List<String> nameList = new ArrayList<String>();
public void addName(String name){
nameList.add(name);
}
public void printNames(){
System.out.println(nameList);
}
public static void main(String[] args) throws Exception {
NameList nameList=new NameList();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Thread t=new MyThread(nameList);
t.setDaemon(true);
t.start();
String str;
while((str=br.readLine())!=null){
if(str.equalsIgnoreCase("exit")){
break;
}
nameList.addName(str);
}
}
}


方法2)、Thread t = new Thread(r);
         其中r爲實現了Runnable接口的類的對象
    class SomeClass
        implements Runnable{
           Public void run(){.........}
           }
    SomeClass sc = new SomeClass()
    Thread t = new Thread(sc)
    t.start();
    //線程的運行體是sc的run方法

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class NameList implements Runnable{
private List<String> nameList = new ArrayList<String>();
public void addName(String name){
nameList.add(name);
}
public void printNames(){
System.out.println(nameList);
}
public void run() {
while (true) {
try {
//打印集合中的內容
printNames();
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
}
public static void main(String[] args) throws Exception {
NameList nameList=new NameList();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Thread t=new Thread(nameList);
t.setDaemon(true);
t.start();
String str;
while((str=br.readLine())!=null){
if(str.equalsIgnoreCase("exit")){
break;
}
nameList.addName(str);
}
}
}

方法3)、內部類---之後再說


(6)、線程安全問題
   兩個以上的線程訪問同一個可變對象。
   加鎖
synchronized (obj) {
語句塊;//obj爲Object的任意對象,用obj做爲惟一鎖來加鎖。有多個synchronized(??)的時候,若是都用obj的話,至關於只有obj一條鑰匙。若是除了obj還有其餘如obj1的狀況下,obj加鎖的不防礙obj1的鎖。
}

      public void f(){synchronized(this/*必須是this而且已把這個線程須要的方法的全部代碼都包括起來*/){......}} 等價於 public synchronized void f(){.........}

(7)、常見的線程安全的類和線程不安全的類
String //不可變類,線程安全
Integer Double... //不可變類,線程安全

StringBuffer //線程安全,至關於StringBuilder加了synchronized
StringBuilder //線程不安全,一般用於單線程,加鎖會阻礙代碼的執行速度

ArrayList //線程不安全,全部集合類(除了Vector 、Hashtable)都是線程不安全
HashSet //線程不安全
HashMap //線程不安全
Vector //線程安全(JDK1.1老版本開始出現)
  特別例子:優化代碼
   Vector vector=....
   int size = vector.size();//優化語句,只調用一次Vecto加快代碼執行速度
    for(int i=0;i<size/*vector.size()*/;i++){...}//for循環由於屢次調用Vector會由於加鎖的問題影響代碼執行速度
Hashtable //線程安全(JDK1.1老版本開始出現)

(8)、瞭解一下Thread類基本方法
  Thread t;
  t.getName(name);
  t.getId();
  t.setName();
  t.setPriority(newPriority);
  t.getPriority();
  Thread.MAX_PRIORITY
  Thread.MIN_PRIORITY
  Thread t=Thread.currentThread();//獲取當前線程的優先級
  Thread.sleep();
相關文章
相關標籤/搜索