`

JAVA基础_线程

阅读更多
1. 程序、进程、线程概念
程序:是计算机指令的集合,它以文件的形式存储在磁盘上。

进程:是程序运行的一个实例,是程序在自己的地址空间上的一次执行。

线程:是程序中一个单一的顺序控制流程。

通常的程序是不能并发执行的。为了使程序能够独立运行,应该为之配置一些进程控制块,即PCB;而由程序段,相关数据段和PCB三部分构成了进程实体。通常我们并不区分进程和进程实体,基本上就代表同一事物。进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。

2. 线程的生命周期
新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存

就绪状态:当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的线程位于可运行池中,等待获得CPU的使用权

运行状态:处于这个状态的线程占用CPU,执行程序的代码

阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。

阻塞状态分为三种情况:
2.1、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中
2.2、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的琐池中。
2.3、 其它的阻塞状态:当前线程执行了sleep()方法,或者调用了其它线程的join()方法,或者发出了I/O请求时,就会进入这个状态中。

wait()和sleep的区别
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。


死亡状态:当线程运行结束或者异常结束。

线程状态转换图:


3. 线程的创建及启动
   继承 Thread类与实现Runnable接口。启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
实现Runnable接口的线程:
package thread;

public class NewThreadRuabble implements Runnable{

	public Thread t;
	
	public NewThreadRuabble(String threadName){
		t = new Thread(this, threadName);
		System.out.println("child NewThreadRuabble----:"+t);
		t.start();
	}
	@Override
	public void run() {
		try{
			for(int i=5; i>0; i--){
				System.out.println("child thread----:"+i);
				Thread.sleep(1000);
			}
		}
		catch(InterruptedException e){
			System.out.println("--InterruptedException:"+e);
		}
		System.out.println("--exit child thread");
	}

}

继承Thread的线程:
package thread;

public class NewThreadThread extends Thread{
	
	public NewThreadThread(String name){
		super(name);
		System.out.println("Child NewThreadThread:"+this);
//		
//		start();
	}

	
	public void run() {
		try{
			for(int i=5; i>0; i--){
				System.out.println("child thread----:"+i);
				Thread.sleep(1000);
			}
		}
		catch(InterruptedException e){
			System.out.println("--InterruptedException:"+e);
		}
		System.out.println("--exit child thread");
	}
}



4. 线程的挂起和恢复
  一但线程开始执行run方法,就会一直到这个run方法执行完成这个线程才退出。但在线程执行的过程中,可以通过suspend。在使用suspend挂起线程后,可以通过resume方法唤醒线程。
虽然suspend和resume可以很方便地使线程挂起和唤醒,但由于使用这两个方法可能会造成一些不可预料的事情发生,调用suspend后,线程不释放对象锁和资源,容易导致多个线程互相等待释放资源,从而引起死锁。所以不推荐使用suspend和resume方法。可以用wait(),notify(),notifyAll()来实现线程的挂起和恢复。见线程的信号灯机制

5. 线程的结束
线程有stop()方法终止线程,但是从来都不使用它,因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果 很难检查出真正的问题所在。而且使用stop()方法会导致抛出ThreadDeath错误。 ThreadDeath继承了java.lang.Error,可见使用stop()的严重性。
可以使用线程的信号灯机制控制线程结束。

6. 线程的信号灯机制
简单的说,就是用同步控制一个状态,状态为true的时候,继续执行,为false的时候继续等待,只到其他线程对该对象调用notify()和notifyAll().
package thread;

class SuspendFlag implements Runnable{
	String name;
	Thread t;
	boolean suspendFlag; //线程线号灯
	
	SuspendFlag(String threadname){
		name = threadname;
		t = new Thread(this, name);
		System.out.println("New SuspendFlag: " + t);
		suspendFlag = false;
		t.start();
	}
	
	public void run() {
		try{
			for(int i = 15; i> 0; i--){
				System.out.println(name +": "+ i);
				Thread.sleep(200);
				synchronized(this){
					while(suspendFlag)wait();
				}
			}
		}
		catch(Exception e){
			
			System.out.println(name + " interrupted.");
			
		}
		System.out.println(name + " exiting.");
	}
	
	synchronized void mySuspend(){
		suspendFlag = true;
	}
	
	synchronized void myResume(){
		suspendFlag = false;
		notify();
	}
}

class SuspendResumeFlag{
	
	
	public static void main(String[] args) {
		SuspendFlag ob1 = new SuspendFlag("One");
		SuspendFlag ob2 = new SuspendFlag("Two");
		double f = 3.4;
		try{
			Thread.sleep(1000);
			ob1.mySuspend();
			System.out.println(" Suspending thread One.");
			Thread.sleep(1000);
			ob1.myResume();
			System.out.println(" Resuming thread One.");
			ob2.mySuspend();
			System.out.println(" Suspending thread Two.");
			Thread.sleep(1000);
			ob2.myResume();
			System.out.println(" Resuming thread Two.");
		}
		catch(Exception e){
			
			System.out.println("Main thread interrupted.");
			
		}
		try{
			System.out.println("Waiting for thread to finish.");
			ob1.t.join();
			ob2.t.join();
		}
		catch(Exception e){
			
			System.out.println("Main thread interrupted.");
			
		}
		System.out.println("Main thread exiting.");
		
	}
}


7. 线程的同步

7.1. 同步和异步的概念

同步用于共享资源的独占,也就是一资源在一个时间点只能被一个对象独占。比如打印机,一次只能打印一个文档,其他文档不可以打印,否则打印的内容会混乱。比如写文档,一个文档一次只能由一人来写入,否则文档内容没有可读性。

异步可以认为一资源在一个时间点可以被多个对象共享。比如读一个文档,可以多个人来读。

可以将同步想象成一次只能由一俩车通行的车道。异步是多车道。

7.2. 线程的同步

实现线程的同步有两种方法。 synchronized() 和 wait() 与 notify()。
  • 大小: 49.4 KB
分享到:
评论

相关推荐

    13.尚硅谷_java基础_多线程

    线程的概念模型 线程的创建和启动 临界资源、对象锁 线程的互斥和同步

    tt.rar_ java_Java 代理服务器_java 线程_代理服务器_服务器

    首先,我们需要理解Java中的网络编程基础。Java提供了一系列的类库,如`java.net.Socket`和`java.net.ServerSocket`,用于创建和管理TCP/IP连接。在代理服务器的场景中,ServerSocket用于监听特定端口,等待客户端的...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    一、线程基础 在Java中,线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。Java提供两种创建线程的方式:继承Thread类或实现Runnable接口。创建线程后,可以调用start...

    choujiangxitong.rar_JAVA 抽奖_抽奖_抽奖 JAVA_抽奖 线程_抽奖系统

    1. **Java编程基础**:Java是一种广泛使用的面向对象的编程语言,具备跨平台特性,通过JVM(Java虚拟机)运行。在这个抽奖系统中,Java被用来编写控制逻辑和用户界面。 2. **多线程技术**:在抽奖系统中,多线程是...

    java基础_java_源码

    "java基础_java_源码"这个标题表明我们即将探讨的是Java编程的基础知识,这通常包括语言的核心概念、语法以及一些关键特性。描述中提到的几个主题——Java网络编程、多线程、IO(输入/输出)、注解和反射机制,都是...

    传智博客_Java培训_毕向东_Java基础课件

    4. **多线程**(传智播客_Java培训_毕向东_Java基础[05-多线程].pdf):Java提供了强大的并发支持,多线程编程是其特色之一。这里会涉及线程的创建、同步、协作以及线程安全问题的处理。 5. **集合**(传智播客_...

    JavaSE_java基础_

    2. **语法基础**:Java的基础语法包括变量声明、数据类型(如整型、浮点型、字符型、布尔型以及引用类型)、运算符(算术、比较、逻辑、位操作等)、流程控制(条件语句if/else,循环语句for/while/do-while)和异常...

    ss.rar_java apple_多线程 java_接力赛跑_赛跑 java

    在实际编程中,开发者需要理解如何创建和管理线程,以及如何利用同步机制确保线程安全,这些都是Java多线程编程的基础。通过这样的练习,可以加深对并发编程的理解,提高编写高并发应用的能力。

    TCP.rar_java Tcp _tcp java_tcp 多线程_tcp多线程

    在IT领域,网络通信是至关重要的部分,而TCP(传输控制协议)作为互联网协议栈中的主力,被广泛用于建立可靠的数据传输...这是一项基础但至关重要的技能,对于任何需要进行网络通信的Java应用程序来说都是不可或缺的。

    java基础代码_java_输入输出流_接口_多线程_异常_

    总结一下,Java基础代码的学习涵盖了输入输出流的使用,如何通过接口定义和实现类的行为规范,多线程的创建与管理,以及异常处理的策略。这些内容构成了Java程序员的基本技能,对于初学者来说至关重要。深入理解并...

    TCP-socket.zip_java_java Tcp _java socket _socket_socket多线程

    3. **多线程**:在Java中,`Thread`类和`Runnable`接口是实现多线程的基础。在TCP Socket通信中,多线程可以用于同时处理多个客户端的连接请求。服务器端通常会为每个新连接创建一个单独的线程,这样就不会因为处理...

    聊天室x_socket聊天室_java线程_聊天室_stuchatroom_ideajava聊天室_

    在这个“聊天室x_socket聊天室_java线程_聊天室_stuchatroom_ideajava聊天室_”项目中,开发者利用了Java的Socket库来创建一个简单的多人聊天室。这个聊天室不仅展示了Socket通信的基本原理,还引入了多线程技术来...

    javajd100_java基础_100例子_

    "javajd100_java基础_100例子_" 这个压缩包文件显然为初学者提供了学习Java基础知识的绝佳资源,通过100个不同的实例帮助理解和掌握Java编程。 首先,让我们了解一下Java的基础知识。Java是一种面向对象的编程语言...

    Java多线程基础-优秀程序员

    线程开发05_线程命名06_线程休眠07_线程优先级08_线程礼貌09_关键资源问题关键../等待...源码详情01_串行与并发02_进程与线程"03线程的生命04.线程的开辟05_线程的命名06_线程的休眠07_线程的优先08_线程的礼让09_...

    PokerGame_Java.rar_PokerGame_java 三公_java牌多线程_扑克 gui java

    《Java实现扑克游戏“三公”:GUI设计与多线程技术详解》 在计算机科学领域,游戏开发是一项集趣味性、技术性和创新性...通过这个项目,不仅可以掌握基础的Java编程技巧,还能深入了解并应用到实际的软件工程实践中。

    JAVA零基础到高级进阶特训营 JAVA多线程并发设计+Spring高级+数据库开发+JAVA基础等

    这套课程既可以作为从零基础开始...课程的主要内容涉及有JAVA基础课程、JAVA多线程与并发编程、数据库开发基础和进阶、Spring Framework、Spring进阶、Spring MVC框架、Spring boot、Java常用类库、Java异常处理等等

    JAVA_sample_150.rar_JavaPOS_Sample.zi_java samp_java sample

    "JAVA_sample_150.rar_JavaPOS_Sample.zi_java samp_java sample"这个标题暗示了我们正在处理一个包含150个Java编程示例的压缩文件,这些示例可能覆盖了Java的基础和进阶特性,旨在帮助初学者更好地理解和掌握Java...

    duoxianchengxiazai.rar_Java 多线程 下载_java 多线程下载

    在标签"java_多线程_下载 java_多线程下载"中,我们再次确认了主题,即使用Java语言进行多线程文件下载。下面将详细讲解Java多线程下载的相关知识点: 1. **线程基础**:在Java中,线程是程序中的执行流。`Thread`...

    javatcp.rar_java TCP线程_java tcp 线程

    Java TCP线程是Java网络编程中的重要组成部分,它允许程序通过TCP/IP协议在网络中进行通信。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而Java提供了丰富的API来支持TCP编程。在这...

Global site tag (gtag.js) - Google Analytics