Java 多线程学习详细总结

论坛 期权论坛 脚本     
niminba   2021-5-23 02:33   2150   0

目录(?)[-]

一扩展javalangThread类
二实现javalangRunnable接口
三Thread和Runnable的区别
四线程状态转换
五线程调度
六常用函数说明
使用方式
为什么要用join方法
七常见线程名词解释
八线程同步
九线程数据传递 

    本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。

首先讲一下进程和线程的区别:

  进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。

  线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。

  线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。

  多进程是指操作系统能同时运行多个任务(程序)。

  多线程是指在同一程序中有多个顺序流在执行。

在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

一、扩展java.lang.Thread类

package com.multithread.learning;
/**
 *@functon 多线程学习
 *@author 林炳文
 *@time 2015.3.9
 */
class Thread1 extends Thread{
 private String name;
  public Thread1(String name) {
    this.name=name;
  }
 public void run() {
    for (int i = 0; i < 5; i++) {
      System.out.println(name + "运行 : " + i);
      try {
        sleep((int) Math.random() * 10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    
 }
}
public class Main {

 public static void main(String[] args) {
 Thread1 mTh1=new Thread1("A");
 Thread1 mTh2=new Thread1("B");
 mTh1.start();
 mTh2.start();

 }

}

输出:

A运行  :  0
B运行  :  0
A运行  :  1
A运行  :  2
A运行  :  3
A运行  :  4
B运行  :  1
B运行  :  2
B运行  :  3
B运行  :  4

再运行一下:

A运行  :  0
B运行  :  0
B运行  :  1
B运行  :  2
B运行  :  3
B运行  :  4
A运行  :  1
A运行  :  2
A运行  :  3
A运行  :  4

说明:

程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用MitiSay的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。

 注意:start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的。

从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
Thread.sleep()方法调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。

实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。

但是start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常。

 Thread1 mTh1=new Thread1("A");
 Thread1 mTh2=mTh1;
 mTh1.start();
 mTh2.start();

输出:

Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Unknown Source)
    at com.multithread.learning.Main.main(Main.java:31)

A运行  :  0
A运行  :  1
A运行  :  2
A运行  :  3
A运行  :  4

二、实现java.lang.Runnable接口

/**
 *@functon 多线程学习
 *@author 林炳文
 *@time 2015.3.9
 */
package com.multithread.runnable;
class Thread2 implements Runnable{
 private String name;

 public Thread2(String name) {
 this.name=name;
 }

 @Override
 public void run() {
  for (int i = 0; i < 5; i++) {
       System.out.println(name + "运行 : " + i);
       try {
       Thread.sleep((int) Math.random() * 10);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
     }
 
 }
 
}
public class Main {

 public static void main(String[] args) {
 new Thread(new Thread2("C")).start();
 new Thread(new Thread2("D")).start();
 }

}

输出:

C运行  :  0
D运行  :  0
D运行  :  1
C运行  :  1
D

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP