讲到线程啦~~
程序、进程和线程相关的含义
程序:是操作系统中实现多个功能的代码块,也叫软件。
进程:正在进行中的程序。
多进程:多个进程同时运行。
线程:是进程中的一个任务,或者称为顺序执行流。
多线程:同时执行一个线程中的多个任务(也就是执行多个顺序执行流)
并发:CPU在执行程序的时候,会将时间划分为一个一个的时间片段,这些时间片段在同一时间只能有一个线程在执行。多个线程之间,时间片段是“走走停停,断断续续”的,但是从宏观上来看,这些线程是一起执行的。我们将多个线程同时执行称为并发。线程并发出现在多线程中。
线程的创建方式
线程有三种创建方式
(1)继承Thread类,重写Thread类中的run方法(线程的任务体),调用线程的start()方法来启动线程。
(2)实现Runnable接口(任务接口),该接口中有一个run方法是任务的方法体。创建线程,然后将任务作为线程的参数传进来,再调用start()方法启动线程。
(3)使用FutureTask来创建线程,用Callable来创建任务,将FutureTask的对象作为参数放到线程的参数里,然后用start方法启动。
start()方法的作用:启动线程之后,该线程会纳入到线程调度机制中,等待CPU的到来。线程获得CPU后,则会调用run方法来执行线程体。
run()方法表示的是线程要执行的任务。
实例代码如下:
第一种方式
public class TestThread1 {
public static void main(String[] args) {
MyTask task1 = new MyTask();
MyTask1 task2 = new MyTask1();
task1.start();
task2.start();
}
}
class MyTask extends Thread{
public void run() {
for(int i=0;i<500;i++)
System.out.println("who are you?");
}
}
class MyTask1 extends Thread{
public void run() {
for(int i=0;i<500;i++)
System.out.println("I am maomao..");
}
}
第二种方式
public class TestRunnable {
public static void main(String[] args) {
//创建任务
Myrunnable my = new Myrunnable();
Myrunnable1 my1 = new Myrunnable1();
//创建线程
Thread t1 = new Thread(my);
Thread t2 = new Thread(my1);
t1.start();
t2.start();
}
}
class Myrunnable implements Runnable{
public void run() {
for(int i=0;i<500;i++)
System.out.println("who are you?");
}
}
class Myrunnable1 implements Runnable{
public void run() {
for(int i=0;i<500;i++)
System.out.println("i am maomao..");
}
}
第三种方式
public class TestFutuerTask {
public static void main(String[] args) {
FutureTask<String> f1 = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
for(int i=0;i<500;i++)
System.out.println("嘿哈");
return null;
}
});
FutureTask<String> f2 = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
for(int i=0;i<500;i++)
System.out.println("呀比");
return null;
}
});
Thread t1 = new Thread(f1);
Thread t2 = new Thread(f2);
t1.start();
t2.start();
}
}
采用内部类的方式实现第一二种方式
public class TestThread2 {
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
for(int i=0;i<500;i++)
System.out.println(getName()+":"+i);
}
};
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
for(int j=0;j<500;j++)
System.out.println("i am maomao..");
}
});
t2.start();
}
}
守护线程
线程分为两种:
前台线程: 我们所创建的线程默认都是前台线程。
注:main方法也是一个前台线程。
后台线程(守护线程): 前台线程都结束时,后台线程结束。
设置守护线程:线程.setDaemon(true);