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线程,一个计数器线程,还有一个是垃圾回收器线程。程序很简单。






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