Java多線程和併發編程實踐的學習心得----基礎篇

Java多線程和併發編程實踐的學習心得1----基礎篇

 

一java線程的基本知識

1、線程:線程是程序運行的基本執行單元,線程是一個程序內部的順序控制流。進程是操作系統中一個個獨立的運行單元。每個進程獨享一塊內存空間。

2、線程和進程的區別:

  • 每個進程都有獨立的代碼和數據空間,進程間切換會有較大的開銷;
  • 線程可以看成是輕量級的進程,同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器,線程切換的開銷小;
  • 多進程:在操作系統能同時運行多個任務;
  • 多線程:在同一程序中有多個順序流同時執行。


上圖是java的一個進程中有2個線程在JVM(java虛擬機中)的抽象運行模型,很好理解。

3、線程的創建與啓動

方法一:實現Runnable接口。

  • 通過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類。



4、

java線程的優先級:


       java線程的優先級從1到10:    Thread.MAX_PRIORITY = 10;

                                                        Thread.MIN_PRIORITY= 1;

                                                        Thread.NORM_PRIORITY= 5;

       使用如下方法操作優先級:       int getPriority();

                                                        voidsetPriority(int i);

5、線程控制的基本方法

這是一個很經典的java線程的控制狀態圖:



這個也是很經典的java線程控制方法,很基礎的方法,但很有用。在後面可能還會經常的見到他們。


還有一個比較重要的方法: 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線程,一個計數器線程,還有一個是垃圾回收器線程。程序很簡單。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章