第一次在開源中國上發博文,簡單的把之前在達內培訓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();