Java多線程和併發編程實踐的學習心得1----基礎篇
一java線程的基本知識
2、線程和進程的區別:
- 每個進程都有獨立的代碼和數據空間,進程間切換會有較大的開銷;
- 線程可以看成是輕量級的進程,同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器,線程切換的開銷小;
- 多進程:在操作系統能同時運行多個任務;
- 多線程:在同一程序中有多個順序流同時執行。
- 通過Thread th = new Thread(target);//targer爲實現Runnable接口對象;
- 其中Runnable接口只有一個方法:public void run()//用於定義線程運行體;
- Runnable接口可以爲多個線程提供共享的數據;
- 在實現Runnable接口的類的run()方法定義中可以使用Thread的靜態方法:
- public static Thread currentThread()獲取當前線程的引用。
方法二:定義一個Thread的子類並重寫其run()方法。
生成該類的對象:MyThread mt = new MyThread();//MyThread繼承Thread類。
java線程的優先級:
java線程的優先級從1到10: Thread.MAX_PRIORITY = 10;
Thread.MIN_PRIORITY= 1;
Thread.NORM_PRIORITY= 5;
使用如下方法操作優先級: int getPriority();
voidsetPriority(int i);
還有一個比較重要的方法: sleep方法:線程的靜態方法:publicstatic void sleep(long millis) throws InterruptedException使當前線程休眠long毫秒。由於是靜態方法,可以由線程直接調用:Thread.sleep(...);
6、線程間的通信
上圖是JMM(Java內存模型)中線程之間通信的模型圖。仔細體會。
多線程重在思想,重在理解。下面就貼上多線程入門的線程計數器的例子程序:
package com.qyl.dome1;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class SeparateSubTask extends Thread{
private int count = 0;
private Counter2 c2;
private boolean runFlag = true;
public SeparateSubTask(Counter2 c2){
this.c2 = c2;
this.start();
}
public void invertFlag(){
runFlag = !runFlag;
}
public void run(){
while(true){
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(runFlag);
if (runFlag){
c2.tF.setText(Integer.toString(count++));
}
}
}
}
public class Counter2 extends Applet {
private Button onOff = new Button("Toggle");
private Button start = new Button("Start");
TextField tF = new TextField(10);
private SeparateSubTask sp;
public void init() {
this.add(tF);
this.add(onOff);
this.add(start);
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(sp==null)
sp = new SeparateSubTask(Counter2.this);
}
});
onOff.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(sp != null)
sp.invertFlag();
}
});
}
public static void main(String[] args) {
Counter2 applet = new Counter2();
Frame mFrame = new Frame();
mFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
mFrame.add(applet, BorderLayout.CENTER);
mFrame.setSize(300, 200);
applet.init();
applet.start();
mFrame.setVisible(true);
}
}
這裏面主要有3個線程,一個UI線程,一個計數器線程,還有一個是垃圾回收器線程。程序很簡單。