`

Java 线程

    博客分类:
  • Java
阅读更多
  • 什么是线程

         根据多任务的原理,在一个程序内部也可以实现多个任务(顺序控制)的并发执行,

      其中的每一个任务被称为线程(Thread)。

       线程与进程的区别如下:

          1.每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。

          2.线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的

                运行栈和程序计数器(PC),线程切换的开销小。

          3.多进程:在操作系统中能同时运行多个任务(程序)

          4.多线程:在同一应用程序有多个顺序流同时执行。

  •    Java的线程是通过java.lang.Thread类来实现的
  •    每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操 作 的,方法run()称为线程体。

       例子1(创建线程的第一种方式):

public class TestThread1 {
	public static  void main(String args[]){
		Runner1 r = new Runner1();
		Thread t1 = new Thread(r);
		Thread t2 = new Thread(r);
		t1.start();
		t1.start();
	}
}
class Runner1 implements Runnable{
	public void run(){
		for(int i=0;i<30;i++){
			System.out.println("NO." + i);
		}
	}
}

   创建线程的步骤:

            1.定义一个类实现Runnable接口,重写其中的run()方法,加入所需的处理逻辑。

            2.创建Runnable接口实现类的对象。

            3.创建Thread类的对象(封装前面的Runnable接口实现类型对象)

            4.调用Thread对象的start()方法,启动线程。

   例子2:(创建线程的第二种方式)

public class TestThread2 {

	public static void main(String args[]){
		Thread t = new Runner2();
		t.setName("TestThread ");
		t.start();
	}
}

class Runner2 extends Thread{
	public void run(){
		for(int i=0; i < 30; i++){
			System.out.println(Thread.currentThread().getName() + i);
		}
	}
}

 两种方式的比较:

   1.使用Runnable接口创建线程:

      可以将CPU,代码和数据分开,形成清晰的模型。

      线程体run()方法所在的类还可以从其他类继承一些有用的属性或方法。

   2.直接继承Thread类创建线程:

      Thread子类无法再从其他类继承

      编写简单,run()方法的当前对象就是线程对象,可直操作。 

  • 后台线程

         后台处理(Background Processing)

        后台线程(Background  Thread/Daemon Thread)

        用户线程(User Thread)

        主线程 (Main Thread)

        子线程(Sun Thread)

     Thread 类提供的相关方法:

     public final boolean isDaemon()

       判断是不是后台线程

     public final void setDaemon(Boolean on)

例子3:

public class TestDaemonThread {
	
	public static void main(String args[]){
		Thread t1 = new MyRunner(10);
		t1.setName("user thread t1");
		t1.start();
		
		Thread t2 = new MyRunner(100);
		t2.setDaemon(true);
		t2.setName("user thread t2");
		t2.start();
		
		for(int i=0; i<10; i++){
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
		System.out.println("main thread over!");
	}
}

class MyRunner extends Thread{
	private int n;
	public MyRunner(int n){
		this.n = n;
	}
	public void run(){
		for(int i=0; i<n; i++){
			System.out.println(this.getName() + ":" + i);
		}
		System.out.println(this.getName() + "over!");
	}
}
  •  线程优先级

          线程的有机用数字来表示,范围从1到10。

          主线程的优先级是5,子线程的优先级默认与其父线程相同。

       Thread 类提供的相关方法:

           public final int getPriority()

          public final void setPriority()

       相关静态整型常量:

          Thread.MIN_PRIORITY=1

          Thread.MAX_PRIORITY=10

          Thread.NORM_PRIORITY=5

      注意:优先级设置并不可靠,所以实际应用中不用优先级来控制线程。

  •  线程串行化

       在多线程程序中,如果在一个线程运行的过程中要用到另一个线程的运行

         结果,则可进行线程的串行化处理。

       Thread类提供的相关方法:

           public final void join()

           public final void join(long millis)

           public final void join(long millis,int nanos)

public class TestJoin {
	public static void main(String args[]){
		Runnable r = new MyRunner();
		Thread t = new Thread(r);
		t.start();
		try {
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		for(int i=0; i<10; i++){
			System.out.println("main thread:" + i);
		}
	}
}
class MyRunner implements Runnable{
	public void run(){
		for(int i=0; i<30; i++){
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}

 运行结果:

Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-0:20
Thread-0:21
Thread-0:22
Thread-0:23
Thread-0:24
Thread-0:25
Thread-0:26
Thread-0:27
Thread-0:28
Thread-0:29
main thread:0
main thread:1
main thread:2
main thread:3
main thread:4
main thread:5
main thread:6
main thread:7
main thread:8
main thread:9
  •   线程休眠

     线程休眠--暂停执行当前运行中的线程,使之进入阻塞状态,待指定的“延迟时间”后再醒来并转入到就绪状态。

 Thread类提供的相关方法:

        public static void sleep(long millis)

        public static void sleeep(long millis,int nanos)

  • 线程让步

         线程让步---让运行中的线程主动放弃当前获得CPU处理的机会,但不是使该线程阻塞,而是使之转入就绪状态。

         Thread 类提供的相关方法:

             public static void yield()

public class TestYield {
	public static void main(String args[]){
		
		Thread t1 = new MyThread(false);
		Thread t2 = new MyThread(true);
		Thread t3 = new MyThread(false);
		
		t1.start();
		t2.start();
		t3.start();
	}
}
class MyThread extends Thread{
	private boolean flag;
	public MyThread(boolean flag){
		this.flag = flag;
	}
	public void run(){
		long start = new Date().getTime();
		for(int i=0; i<30; i++){
			if(flag){
				Thread.yield();
			}
			System.out.println(Thread.currentThread().getName() + ":" + "\t");
		}
		long end = new Date().getTime();
		System.out.println("\n" + Thread.currentThread().getName() + "excute time:" + (end -start) + "millis");
	}
}
  • 线程挂起和恢复

         线程挂起--暂时停止当前运行中的线程,使之转入阻塞状态,并不会自动恢复运行。

         线程恢复--使得一个已经挂起的线程恢复运行。

         Thread类提供的相关方法:

             public final void suspend()

             public final void resume()

  •    终止线程运行

   提倡使用

public class TerminateThread {
	public static void main(String args[]){
		Test r = new Test();
		Thread t = new Thread(r);
		t.start();
		for(int i=0; i<10; i++){
			try{
				Thread.sleep(5);
				System.out.println("\nin thread main i=" + i);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
		System.out.println("Thread main is over.");
		r.shutDown();
	}
}
class Test implements Runnable{
	private boolean flag = true;
	public void run(){
		int i = 0;
		while (flag == true){
			System.out.println(" " + i++);
		}
	}
	public void shutDown(){
		this.flag = false;
	}
}
  • 线程控制基本方法

           isAlive()

            判断线程是否还“活”着,即线程是否还未终止。

             getPriority()

             获得线程的优先级数值(不实用)

            setPriority()

               设置线程的优先级数值(不实用)

            sleep()

                将当前线程睡眠指定毫秒数。

             join()

               调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,

                   再恢复当前线程的运行。

             yield()

               让出CPU,当前线程就如就绪队列等待调度。

             suspend()/resume()

               挂起和恢复线程。

           wait()

             当前线程进入对象的wait pool

           notify()/notifyAll()

               唤醒对象的wait pool中的一个/所有的等待线程。

 

  • 互斥锁

          在Java语言中,引入了对象互斥的概念,来保证共享数据操作的完整性。

          每个对象都对应一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,

             只能有一个线程访问该对象。

          关键字synchronized来与对象的互斥联系。当某个对象用synchronized修饰时,

            表明该对象在任一时刻只能由一个线程访问。

  • synchronized用法

        用于方法声明中,标明整个方法为同步方法:

          public synchronized void push(char c){

           data[idx] = c;

           idx++;

           }

           用于修饰语句块,表明整个语句块为同步块。

           public char pop(){

           synchronized(this){

               idx--;

               return data[idx];

           }

          }

  • 线程死锁

         并发运行的多个线程间彼此等待,都无法运行的状态被称为线程死锁。

 

 

 

分享到:
评论

相关推荐

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    Java线程状态流转图

    Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    java线程.pdf

    根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java...

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...

    Java线程.ppt

    Java线程是Java编程中的重要概念,特别是在多核处理器和并发处理中不可或缺。Java线程允许程序在同一时间执行多个不同的任务,从而提高了程序的效率和响应性。在燕山大学信息学院计算机系的课程中,李峰教授讲解了...

    java线程深入解析

    Java线程是Java编程语言中的核心概念,尤其在多任务处理和并发编程中扮演着重要角色。线程允许一个程序内部同时执行多个独立的控制流,使得程序能够更高效地利用处理器资源。本文将深入解析Java线程的相关知识点,...

    Java线程(第三版)

    《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...

    java线程.rar

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...

    java线程文档大全

    Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含...

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...

    Java线程培训资料

    ### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...

    Java-Thread-Affinity,将Java线程绑定到给定的内核.zip

    Java线程亲和性(Thread Affinity)是一个高级并发编程概念,主要涉及到操作系统调度和硬件资源的优化。在多核处理器系统中,线程亲和性允许开发者指定某个线程应该运行在哪个特定的处理器核心上,从而提高性能、...

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    4种常用Java线程锁的特点,性能比较、使用场景.pdf

    4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...

    JAVA线程学习(源代码)

    本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,帮助我们深入理解和实践线程的使用。 首先,我们要理解Java中的线程模型。Java线程由`java.lang.Thread`类或`java.util.concurrent.Executor`框架来...

Global site tag (gtag.js) - Google Analytics