Java SE高级开发——多线程的实现

进程与线程的概念:

进程:操作系统中,一个程序的执行周期称为一个进程

线程:一个程序同时执行多个任务的时候,我们把每一任务称作一个线程

进程与线程相比较,线程更”轻量级“,创建、撤销一个线程比启动一个进程开销要小的多。但是,没有进程就没有线程,进程一旦终止,其内的线程也不再存在。

多线程与多进程的区别:

每个进程都拥有自己的完整变量,而线程之间则共享数据。共享数据使得线程间通信更加方便、有效。

多线程实现:

1、继承Thread类实现多线程
class MyThread extends Thread{//定义线程主体类
private String title;
public MyThread(String title){
this.title = title;
}
@Override
public void run(){
for(int i = 0; i < 10; i ){
System.out.println(this.title " i = " i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
MyThread myThread1 = new MyThread("线程1");//创建新线程
MyThread myThread2 = new MyThread("线程2");
MyThread myThread3 = new MyThread("线程3");
myThread1.run();//启动线程
myThread2.run();
myThread3.run();
}
}

运行结果:

java多进程耗cpu吗 java多进程怎么实现的_java几种多线程

由运行结果可以看出,此时线程只是按顺序打印,并没有多线程的共享数据的性质,所有我们要特别注意:启动线程需要使用start()方法。

public static void main(String[] args) {
MyThread myThread1 = new MyThread("线程1");
MyThread myThread2 = new MyThread("线程2");
MyThread myThread3 = new MyThread("线程3");
myThread1.start();
myThread2.start();
myThread3.start();
}

此时线程变为交替执行

java多进程耗cpu吗 java多进程怎么实现的_java几种多线程_02

2、Runable实现多线程
class MyThread implements Runnable{
private String title;
public MyThread(String title){
this.title = title;
}
@Override
public void run() {
for(int i = 0; i < 10; i ){
System.out.println(this.title " i = " i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
MyThread myThread1 = new MyThread("线程1");
MyThread myThread2 = new MyThread("线程2");
MyThread myThread3 = new MyThread("线程3");
new Thread(myThread1).start();
new Thread(myThread2).start();
new Thread(myThread3).start();
}
}

java多进程耗cpu吗 java多进程怎么实现的_java几种多线程_03

注意:实现Runnable接口比继承Thread类所具有的优势:

a、从形式上来说,可以避免Java中的单继承局限

b、使用Runnable实现的多线程的程序类可以更好的描述出程序共享的概念

3、Callable实现多线程
class MyThread implements Callable{
private int tickets = 10;
@Override
public String call() throws Exception {
while (this.tickets >= 0){
System.out.println("剩余票数为:" this.tickets--);
}
return "票卖完了";
}
}
public class ThreadTest {
public static void main(String[] args) throws InterruptedException,ExecutionException {
FutureTask task = new FutureTask<>(new MyThread());
new Thread(task).start();
new Thread(task).start();
System.out.println(task.get());
}
}

通过继承Callable来实现多线程的特点:可以取得线程执行结果,具有返回值

java多进程耗cpu吗 java多进程怎么实现的_d3_04