什么是线程:
Java 语言提供了并发机制,允许开发人员在程序中执行多个线程,每个线程完成一个功能,并与其他线程并发执行。这种机制被称为多线程。简单的说线程就是执行代码的一个模块。
线程分为:主线程、子线程 。写在main方法中的所有代码都是运行在主线程的,而子线程就是需要创建新的线程,在主线程创建的所有的线程都是子线程。
线程的创建:
线程的实现方式有很多种,都是大同小异的用法。这里简单较少几种:继承Thread类实现抽象方法run;实现Runable接口实现抽象方法run;实现Callable接口,并用其初始化Thread,然后创建Thread实例等方法;
Thread实现线程:
//定义线程
public class DThread extend Thread{
@Override
public void run(){
//运行在子线程
int i = 0;
while (i <= 100) {
System.out.println("子线程" + i + "\n");
i ++;
}
}
}
public class Run{
public static void main(String[] args){
DThread dt = new DThread();//创建线程实例 运行在主线程
dt.start();//启动线程 运行在主线程
int i = 0;
while (i <= 100) {
System.out.println("主线程" + i + "\n");
i ++;
}
}
}
我们来看一下运行结果:
主线程8
主线程9
主线程10
主线程11
主线程12
主线程13
主线程14
主线程15
子线程0
主线程16
主线程17
主线程18
主线程19
主线程20
主线程21
主线程22
这是我截取的部分结果可以看到主线程15之后是子线程0,由此可得:线程是一直在切换的,切换并无规律可言,不管有多少的线程都是一直在切换代码运行,这就是线程并行,并行的好处就是更加高效率的利用了cpu的资源,同时这个也是缺点开大量的线程cpu可能处理不过来造成了Out Of Memory,也就是内存溢出的问题。
Runable接口实现线程:
class DRunable implements Runnable{
@Override
public void run() {
// 运行在子线程
}
}public static void mian(String[] args){
DRunable dr = new DRunable();//创建线程实例 运行在主线程
Thread t = new Thread(dr);//创建线程 传入runable实例 运行在主线程
t.start();//启动线程 运行在主线程
}
运行结果和Thread实现的线程没有区别。
有没有发现一个问题,runnable接口实现的线程是需要Thread来启动线程的,那么为什么还会有Runnable接口呢,或者说Runnable这么麻烦为什么还不淘汰?就是因为 单继承 多实现 的原理,讲到这里大家知道为什么还会有runnnable接口了吗?
Callable实现线程:
Callable线程保证了只执行一个,就是说同开5个DCallable线程运行结果只执行了一次,看代码:
class DCallable implements Callable<Integer>{ //泛型String规定了线程返回的参数类型
public Integer call() throws Exception{
//运行在子线程
String s = "1 + 1 = 2 ";
System.out.println(s);
return null;
}
}
public static void main(String[] args){
DCallable< Integer > dc = new DCallable();//创建线程实例 运行在主线程
FutureTask< Integer > ft = new FutureTask(dc); //创建futureTask实例 运行在主线程
new Thread(ft).start();//启动线程 运行在主线程
}
好了今天我们介绍了三种线程的实现方式及简单的理解,还有一种实现方式或者说线程的管理线程池CachedThreadPool,我们在下次进行介绍。
网友评论