概念粗解
谈到线程,必谈进程。那么何为进程?
进程直译为:系统中正在运行中的程序。
知道了进程,接下来谈谈线程。
其实线程就是进程中一个负责执行程序的控制单元,即线程是进程的一个特定执行路径。
多线程则就是一个进程中可以条执行路径。
多线程的意义就是为了能够同时运行多部分代码,并且每个线程都有自己需要运行的内容,这些内容称之为线程要执行的任务。
多线程的利弊
利:解决了多部分同时运行的问题。
弊:线程太多会导致效率的降低。
其实应用程序中的的多线程执行都是CPU在做快速的切换完成的,这个切换是算法调度的。有兴趣可以参考浅谈关于多线程在CPU上是怎样分布的了解。
JVM中的多线程解析
JVM启动的时候就启动了多个线程,最明显的是主线程和垃圾回收线程。
主线程:执行main函数的线程
该线程的任务代码都定义在main函数中。
垃圾回收线程:负责垃圾回收的线程
class Demo extends Object
{
/*垃圾回收方法
当垃圾回收器确定不存在对该对象的更多引用时
由对象的垃圾回收器调用此方法
*/
public void finalize()
{
System.out.println("demo ok");
}
}
public class ThreadDemo
{
public static void main(String[] args)
{
new Demo();
new Demo();
System.gc();//运动垃圾回收器
new Demo();
System.out.println("hello thread");
}
}
详细关于JVM垃圾回收器可参考
Jvm垃圾回收器(终结篇)
当程序都在主线程执行时:则可看出程序是按照从上到下的顺序依次执行完成。
class Demo
{
private String name;
Demo(String name)
{
this.name = name;
}
public void show()
{
for(int i = 0; i < 5; i++)
{
for(int j=-99999999; j<999999999; j++) {}
//Thread.currentThread().getName() 获取当前线程名
System.out.println(name+" : "+ i + "..." + Thread.currentThread().getName());
}
}
}
public class ThreadDemo
{
public static void main(String[] args)
{
Demo demo1 = new Demo("旺财");
Demo demo2 = new Demo("xiaoqiang");
demo1.show();
demo2.show();
}
}
则可得到执行结果:
旺财 : 0…main
旺财 : 1…main
旺财 : 2…main
旺财 : 3…main
旺财 : 4…main
xiaoqiang : 0…main
xiaoqiang : 1…main
xiaoqiang : 2…main
xiaoqiang : 3…main
xiaoqiang : 4…main
从执行结果则可看出来代码是按照从上到下的顺序执行,并且都是在主线程。
怎么开启其他线程呢???
通过java API 文档 java.lang包里面找到Thread类,此类为线程类,可以进行参考。
为什么要去开启其他线程呢???
开启线程的目的是为了开启其他的执行路径,这些路径用于运行指定的代码,以实现代码同时运行的效果。每个执行路径所运行的代码就是这个路径的任务。
创建一个新的执行线程有两种方法
创建线程方式一
- 定义一个类继承Thread类
- 覆盖Thread类中的run方法
- 直接创建Thread类的子类对象创建线程
- 调用start方法开启线程并调用线程的任务run方法执。
JVM创建的主线程的任务都定义在主函数。从上面代码运行可以看出。
那么,自定义线程的任务会在哪里呢???
Thread类用于描述线程,线程是需要任务的。所以Thread类也有对任务的描述。这个任务就是通过Thread类中的run方法来体现的,也就是说:run方法就是封装自定义线程运行任务的函数,run方法中的代码就是线程要运行的任务代码。
将上面的代码进行修改 让其在其他线程执行
/**
* 开启线程是为了运行指定的代码,所以只要继承Thread类,并复写run方法,
* 并将运行的代码定义在run方法中即可
*/
class Demo extends Thread
{
private String name;
Demo(String name)
{
this.name = name;
}
public void run()
{
for(int i = 0; i < 5; i++)
{
for(int j=-99999999; j<999999999; j++) {}
System.out.println(name+" : "+ i + "..." + Thread.currentThread().getName());
}
}
}
public class ThreadDemo
{
public static void main(String[] args)
{
Demo demo1 = new Demo("旺财");
Demo demo2 = new Demo("xiaoqiang");
/*开启线程,切记不是调用run()方法。run()方法是通过start()方法开启现成后,自动调用执行的。*/
demo1.start();
demo2.start();
}
}
则可得到执行结果:
xiaoqiang : 0…Thread-1
xiaoqiang : 1…Thread-1
旺财 : 0…Thread-0
旺财 : 1…Thread-0
旺财 : 2…Thread-0
旺财 : 3…Thread-0
旺财 : 4…Thread-0
xiaoqiang : 2…Thread-1
xiaoqiang : 3…Thread-1
xiaoqiang : 4…Thread-1
注意:也可能是其他运行结果,这是两个线程同时打印的结果,不是出现什么错误了