以前在学习操作系统的时候老师讲过线程,现在自己对Java知识掌握好了,开始复习一次。
首先,我讲一下线程和进程的区别:
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
多进程简单理解就是操作系统能同时运行多个任务,多线程就是同一个程序中有多个顺序流在进行。
线程给我们带来的好处:
1.充分利用CPU资源。
当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。这将会造成大量的计算资源的浪费。而在程序中使用多线程可以再某一个线程处于休眠或者阻塞时,而CPU又恰好处于空闲状态时来运行这个线程。因此,CPU资源得到了充分利用。
2.简化编程模型。
如果程序只完成一项任务,那只要写一个单线程的程序,并且按照执行这个任务的步骤编写代码就可以了。如果要完成多任务,如果还是用单线程的话,就要在程序中判断每项任务是否应该执行以及什么时候执行。这样有利于开发人员对程序的理解和维护。
3.简化异步事件的处理。
当一个服务器应用程序在接受不同客户端连接时最简单地处理方法就是为每一个客户端连接建立一个线程。然后监听线程仍然负责监听来自客户端的请求。如果使用单线程的话,当监听一个客户端的时候,如果还没结束这个线程没就不能监听其他客户端了。
4.使GUI更有效率。
如果用了多线程,比如当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用,对事件的反应非常快。
5.节约成本。
提高程序的执行效率一般有三种方法:
(1)增加计算机的CPU个数;
(1)增加计算机的CPU个数;
(2)为一个程序启动多个进程;
(3)在程序中使用多线程。
第一种方法是最容易做到的,可是是最昂贵的。理论上任何程序都可以实用这种方法来提高执行效率。
第二种方法不容易共享数据,启动多个线程会消耗大量的系统资源。
第三种方法不需要购买CPU,也不会因为启动太多的线程而占用大量的系统资源,并且多线程可以模拟多块CPU的运行方式。
在Java中创建线程有两种方法:实用Thread类和使用Runnable接口。在使用Runnable接口时要建立一个Thread实例。
Thread类的构造方法被重载了八次,如:
Runnable target
实现了Runnable接口的类的实例。
String name
线程的名字。
ThreadGroup group
当前建立的线程所属的线程组。
log stackSize
线程栈的大小,这个值一般是CPU页面的整数倍,如x86的页面大小是4KB。在x86平台下,默认的线程栈大小是12KB。
下面代码演示如何使用Thread类来创建线程:
public class ThreadDemo extends Thread{
private String who;
@Override
public void run() {
System.out.println(who+":"+this.getName());
}
public ThreadDemo(){};
public ThreadDemo(String who){
this.who = who;
}
public ThreadDemo(String who,String name){
super(name);
this.who = who;
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
ThreadDemo thr1 = new ThreadDemo();
ThreadDemo thr2 = new ThreadDemo("Thread2");
ThreadDemo thr3 = new ThreadDemo("Terry");
ThreadDemo thr4 = new ThreadDemo("Aliey", "thread-vivi");
thr2.setName("KamTo");
thr4.start();
thr3.start();
thr1.start();
thr2.start();
}
}
结果为:
实现Runnable接口的类必须使用Thread类的实例才能创建线程。通过Runnable接口创建线程分为两步:
1.将实现Runnable接口的类实例化;
2.建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法中,然后通过Thread类的start方法建立线程。
下面代码演示如何使用Runnable接口来创建线程:
public class ThreadDemo implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
ThreadDemo thr1 = new ThreadDemo();
ThreadDemo thr2 = new ThreadDemo();
Thread thr11 = new Thread(thr1);
Thread thr22 = new Thread(thr2, "Aliey");
thr11.setName("Terry");
thr11.start();
thr22.start();
}
}
结果为: