在了解线程之前我们先了解几个名词的含义:
程序:一组指令的集合(我们所写的代码)
进程:正在运行的程序(操作系统的执行单元)
注:程序和进程的区别就是前者是静态,后者是动态。一个进程对应一个程序,一个程序可以有多个进程。
线程:进程中的单一执行流(轻量级的进程,是进程的执行单元)
注:一个进程至少含有一个线程。
在学习线程中,接触更多是多线程
多线程的优点:(1)多线程可以同时并发执行多个任务,当程序的某个功能部分正在等待某些资源的时候,此时又不愿意因为等待而造成程序暂停,那么就可以创建另外的线程进行其他的工作。
(2)多线程可以最大限度地减低CPU的闲置时间,从而提高CPU的利用率。
小例子:做饭的问题
煮饭(20min) 洗菜(15min) 切菜(5min) 炒菜(15min) 吃饭(时间不计)
这个过程如果依次进行所需时间为:55min
package www.huaxin08.com;
public class Women {
public static void main(String[] args)
{
Women men = new Women();
men.cookie();
men.wash();
men.cut();
men.fire();
men.eat();
}
//煮饭
//Thread.sleep(millis);休眠方法
public void cookie(){
System.out.println("开始做饭~~");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("煮饭完成!!!");
}
//洗菜
public void wash(){
System.out.println("开始洗菜~~");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("洗菜完成!!!");
}
//切菜
public void cut(){
System.out.println("开始切菜~~");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("切菜完成!!!");
}
//煮菜
public void fire(){
System.out.println("开始炒菜~~");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("炒菜完成!!!");
}
//吃饭
public void eat(){
System.out.println("开始吃饭~~");
}
}
在没有用到线程的时候该程序的执行顺序是依次进行的,总共用的时间为:55毫秒。
使用多线程方法,代码如下:
package www.huaxin08.com;
public class Women {
public static void main(String[] args)
{
Women men = new Women();
//创建煮饭线程对象
CookieThread ct = new CookieThread();
ct.start();//启动线程
//洗菜
WashThread wt = new WashThread();
wt.start();
//切菜
CutThread ctd = new CutThread();//创建线程对象
Thread cutThread = new Thread(ctd);//把线程对象包装成Thread对象
cutThread.start();
//煮菜
FrieThread ft = new FrieThread();
Thread ftThread = new Thread(ft);
ftThread.start();
//吃饭
men.eat();
}
//吃饭
public void eat(){
System.out.println("开始吃饭~~");
}
}
public class CookieThread extends Thread{
@Override
public void run() {
//super.run();//可以写也可以不写
cookie();
}
//煮饭
//Thread.sleep(millis);休眠方法
public void cookie(){
System.out.println("开始做饭~~");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("煮饭完成!!!");
}
}
public class WashThread extends Thread{
@Override
public void run() {
wash();
}
//洗菜
public void wash(){
System.out.println("开始洗菜~~");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("洗菜完成!!!");
}
}
public class CutThread implements Runnable{
public void run() {
cut();
}
//切菜
public void cut(){
System.out.println("开始切菜~~");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("切菜完成!!!");
}
}
public class FrieThread implements Runnable{
public void run() {
fire();
}
//煮菜
public void fire(){
System.out.println("开始炒菜~~");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("炒菜完成!!!");
}
}
执行的结果:执行时间很短
开始做饭~~
开始洗菜~~
开始切菜~~
开始吃饭~~
开始炒菜~~
切菜完成!!!
洗菜完成!!!
炒菜完成!!!
煮饭完成!!!