从保定回来之后,听了小康讲的线程,发现我已经很久没有复习java基础了,对其中很多知识都有了陌生感。趁着空闲的两天看了一下线程的基础知识。
一 :程序、进程、线程的概念
程序(program)是为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象;
进程(process)是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生、存在和消亡的过程。
如:运行中的QQ,运行中的播放器,同时程序是静态的,进程是动态的。
线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。
若一个程序可同时执行多个线程,就是支持多线程的。
何时需要多线程?
程序需要同时执行两个或多个任务;
程序需要实现一些需要等待的任务时,如用户输入、文件读写操作等;
需要一些后台运行的程序时。
二:多线程的创建和使用
多线程的创建有两种方式:一种是继承,一种是实现。
1.继承Thread类
java语言的JVM允许程序运行多个线程,它通过java.lang.Thread类来实现。每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体。通过该Thread对象的start()方法来调用这个线程。
线程类
<span style="font-family:KaiTi_GB2312;">// 1.创建一个继承于Thread的子类
class SubThread extends Thread{
//2.重写Thread类的run()方法,方法内实现此子线程要完成的功能
public void run(){
for(int i=0;i <= 100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
</span>
main()方法调用
<span style="font-family:KaiTi_GB2312;">public class TestThread {
public static void main(String[] args){
//3.创建一个子类的对象
SubThread st1 =new SubThread();
SubThread st2 =new SubThread();
//4.调用线程的start();启动此线程;调用相应的run()方法
//5.一个线程只能执行一次start()
st1.start();
st2.start();
for(int i=0;i <= 100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
</span>
2.实现Runnable接口
Thread类也是实现了Runnable接口,实现Runnable接口也需重写run方法。
线程类:
<span style="font-family:KaiTi_GB2312;"> class PrintNum1 implements Runnable{
// 1.实现接口的抽象方法
public void run(){
for(int i=1;i<=100;i++){
if(i % 2 ==0){
System.out.println(Thread.currentThread().getName() +":"+i);
}
}
}
}
</span>
main()方法调用
<span style="font-family:KaiTi_GB2312;"> 调用的时候该类做参数传递即可
public class TestThread2{
public static void main(String[] args){
PrintNum1 p =new PrintNum1();
//要想启动一个多线程,必须调用start()
// 4.将此对象作为形参传递给Thread类的构造器中,创建Thread类的对象
Thread t1 =new Thread(p);
// 5.调用start()方法,启动线程并执行run()
t1.start();// 启动线程,执行Thread对象生成时构造器形参的对象的run()方法
}
}
</span>
通过两种方式可以看出第二种方式比第一种好。因为实现优于继承。通过实现Runnable接口,避免了java单继承的局限性,同时如果多个线程要操作同一份资源,此时更适合实现的方式。
而通过继承Thread类的方式,如果多个线程操作的话,需要实例化多个子类线程,而其共享的资源就会声明为static,会一直存在于内存。而实现Runnable接口的方式,实例化一个类,将其作为参数传递给不同的线程既可。