`

黑马程序员--java基础复习--线程

 
阅读更多
  1. ---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------------

一、线程概述

  线程是程序运行的基本执行单元。当操作系统在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(也被称为主线程)来作为程序运行的入口点。进程和线程是现代操作系统中两个必不可少的运行模型,在操作系统中可以有多个进程,每个进程又可以有多个线程。进程和进程之间不共享内存,系统中的进程是在各自独立的内存空间中运行的。而一个进程的线程可以共享系统分配给这个进程的内存空间,当然也有自己的内存空间。

  任何一个线程在建立时都会执行一个函数,在java中主函数执行的是main函数,其他线程执行的是run函数,但是是通过start()来执行。

  一块CPU同时只能执行一条命令,多线程并不是表示CPU在同时执行多个线程,只是这些线程在交替执行,因为交替的时间单位是毫秒级的,所以看一来就和同时执行差不多。

二、线程的优点

  合理使用线程,可以减少开发和维护成本,改善复杂应用程序的性能。如在GUI应用程序中,可以创建多个线程来处理大量的事件,在服务器上可以建立线程来响应多个客户请求等。

  使用线程,将会从以下五个方面改善我们的应用程序:

  1. 充分利用cpu资源  单线程程序在在发生阻塞时,比如IO流里边的read()方法、net里边的TCP服务器的accept()方法都是阻塞式的,CPU就处于空闲状态如果没有第二个线程的话,就会浪费大量的计算机资源。
  2. 简化编程模型  将每个小任务分成每一个小线程来处理,方便维护。当然,当不同的任务之间存在共享的资源,就要考虑线程的安全问题了
  3. 简化异步事件的处理  就是将每个客户端的请求用多个线程去处理,免去阻塞方法带来的麻烦。
  4. 提高GUI的效率  现代的GUI框架中都使用了一个单独的事件分派线程来对GUI时间进行扫描,这就相当于多线程。如果用单线程来做GUI的话,就相当于一个线程里边既有不断扫描GUI事件的代码,还要有执行其他程序的代码,如果这些代码太长,那就相当于事件只有等代码执行到扫描语句的时候才有效,这明显是不符合程序设计要求的。
  5. 节约成本 提高程序的执行效率的方法一般有三种
  • 增加CPU个数  这个很容易做到,当然得花钱,还是不少钱。
  • 为一个程序启动多个进程  这种方式不容易共享数据,而且消耗系统资源
  • 在程序中使用多线程  这是最好的方法,不花钱,不占太多的系统资源,只是充分利用系统分配给某个进程的资源

三、java线程的模型

  java是纯面向对象的语言,因此java的线程模型也是面向对象的。

  在java中可以通过两种方法创建线程:

1、继承Thread类

2、实现Runnable接口

考虑到java中只能单继承,一般采用第二种方式来创建线程,而且第二种方式创建的线程可以更好的使用同一资源,因为可以通过同一个对象来开启线程,而第一种方式如果要使用同一个资源的话,则必须将资源定义成该类的静态变量,没有第二种方式灵活。

 

 四、线程的生命周期

  线程有四个不同的状态:开始(等待)、运行、挂起和停止

  1. 创建并运行线程   线程在建立 后并不马上执行run()方法,这时候就处于等待状态,在这个状态下可以通过Thread类的方法来设置线程的各种属性,如线程的优先级 setPriorit()、线程名字setName()和线程的类型setDemon()等,而且这些属性只能在这个状态设置。当调用start()方法后,线程开始执行run()方法中的代码,线程这时候就处于活动状态(挂起的线程也处于活动状态)。
  2. 挂起和唤醒线程  线程的挂起可以用sleep和wait()来操作,最早的时候还有一个suspend方法,但是因为会产生一些那一掌控的事,所以已经过时,唤醒则使用resume(也过时了)和notify、notifyAll(),这里面要注意wait和notify方法的使用前提是锁,只有共用一个锁的多个线程才能通过这两个方法来挂起和唤醒。
  3. 终止线程 有三种方法终止线程
  • 自然终止,就是run方法执行完后终止
  • stop()方法强行终止  用这个方法就会直接中断线程而且从中断那一刻线程所执行到的代码的位置以后的代码都不会执行,相当于计算机断电了,什么善后都没的
  • interrupt()方法中断线程   用这个方法只是中断挂起状态,结束挂起状态后线程还会继续执行下去,知道执行完run()方法
package thread;

public class ThreadTest extends Thread{

	public static void main(String[] args) throws Exception {
		ThreadTest tt = new ThreadTest();
		tt.start();
		System.out.println("50秒内按任意键终止");
		System.in.read();
		tt.stop();
		//tt.interrupt();
		tt.join();
		System.out.println(tt + " 线程已经退出");
	}
	
	public void run(){
		try {
			Thread.sleep(50000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			System.out.println("谁中断了我?");
		}
	}
}

 

用tt.stop()方法的执行结果为:

50秒内按任意键终止
a
Thread[Thread-0,5,] 线程已经退出

用tt.interrupt()方法的执行结果为:

50秒内按任意键终止
a
谁中断了我?
Thread[Thread-0,5,] 线程已经退出

 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics