1.线程概述 线程是程序运行的基本执行单元。一个进程至少有一个线程(主线程),作为程序的入口点。
一个线程可以等待另一个线程的处理结果
线程之间可以共享内存
各个拥有一个属于自己的内存空间(线程栈), 是在建立线程时由系统分配的,主要用来保存线程内部所使用的数据,如线程执行函数中所定义的变量。
2.线程的常用事例(1)GUI开发 使用单线程来处理GUI事件时,必须使用循环来对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还得来执行其他的程序代码。如果这些代码太长,那么GUI事件就会被“冻结”,直到这些代码被执行完为止。
现代的GUI框架(如SWING、AWT和SWT)中都使用了一个单独的
事件分派线程(event dispatch
thread,EDT)来对GUI事件进行扫描。当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。由于EDT的任务只是对GUI
事件进行扫描,因此,这种方式对事件的反映是非常快的。
(2)服务器监听 一个服务器应用程序在接收不同的客户端连接时最简单地处理方法就是为每一个客户端连接建立一个线程。然后监听线程仍然负责监听来自客户端的请求。如果这种应用程序采用单线程来处理,当监听线程接收到一个客户端请求后,开始读取客户端发来的数据,在读完数据后,read方法处于阻塞状态,也就是说,这个线程将无法再监听客户端请求了。而要想在单线程中处理多个客户端请求,就必须使用非阻塞的Socket连接和异步I/O.但使用异步I/O方式比使用同步I/O更难以控制,也更容易出错。因此,使用多线程和同步I/O可以更容易地处理类似于多请求的异步事件。
(3)多任务 充分利用CPU资源显得尤为重要。当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。这将造成大量的计算资源的浪费。而在程序中使用多线程可以在某一个线程处于休眠或阻塞时,而CPU又恰好处于空闲状态时来运行其他的线程。
显示一个时钟的时、分、秒三个指针,使用单线程就得在循环中逐一判断这三个指针的转动时间和角度。如果使用三个线程分另来处理这三个指针的显示,那么对于每个线程来说就是指行一个单独的任务。
3.Thread的构造方法Thread类的构造方法
- public Thread( );
-
public Thread(Runnable target);
-
public Thread(String name);
-
public Thread(Runnable target, String name);
-
public Thread(ThreadGroup group, Runnable target);
-
public Thread(ThreadGroup group, String name);
-
public Thread(ThreadGroup group, Runnable target, String name);
-
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
Runnable target 实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。
String name 线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。
ThreadGroup group 当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。
long stackSize 线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB.在x86平台下,默认的线程栈大小是12KB.
4. 线程的四种状态 线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。
- // 开始线程
-
public void start( );
-
public void run( );
-
-
// 挂起和唤醒线程
-
public void resume( ); // 不建议使用
-
public void suspend( ); // 不建议使用
-
public static void sleep(long millis);
-
public static void sleep(long millis, int nanos);
-
-
// 终止线程
-
public void stop( ); // 不建议使用
-
public void interrupt( );
-
-
// 得到线程状态
-
public boolean isAlive( );
-
public boolean isInterrupted( );
-
public static boolean interrupted( );
-
-
// join方法
-
public void join( ) throws InterruptedException;
参考文献1.多线程指南.
2.线程简介.
3.用Thread类创建线程.
阅读(1091) | 评论(0) | 转发(1) |