在学习线程之前必须了解线程与进程的区别:
在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程。但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行。因此线程被引入操作系统。
因此一个进程可能对应着多个线程,一个线程只能属于一个进程。一个线程所占用的空间要远远小于一个进程所占用的空间。
java 中线程实现的几种方式:
1继承Thread类,重写run()方法。
2实现Runnable 接口,实现接口中的run()方法(run方法没有返回值)
注:因为java单继承机制,因此在实现线程时建议使用实现Runnable接口的方法
3实现Callable接口,实现call()方法(call方法有返回值)
1继承Thread类,重写run()方法
因为Thread类也实现了Runable接口,在实现过程中实现了部分接口的方法,我们在此只需要实现run()方法即可
package threadTest;
//通过继承thread类方法实现线程
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("陈同学在学习多线程"+i);
}
}
}
测试写好的线程类:
因为线程类只需要实现run方法即可,因此可以使用lamda表达式的方法写出一个线程
package threadTest;
public class ThreadLearn {
public static void main(String[] args) {
MyThread myThread=new MyThread();
// myThread.start();
myThread.run();
// lamda表达式方法实现线程
new Thread(){
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("这是主线程的程序");
}
}
}.start();
}
}
调用run方法效果如下:在自定义线程执行结束后才会执行主线程中的方法
但是在实际开发过程中,我们常常需要多个线程并行:
在此引入并行和并发的区别:
并发指的是两件事情同时发生。
并行指的是两件事宏观上同时发生,微观上交替执行。
在举个形象例子:
在上课时同学们进入教室,在上课铃响时,同学们进入教室(上课铃响和同学进入教室两件事情同时发生,为并发),小明同学和小陈同学同时进入教室(两人宏观上时同时进入教室,在实际肯定有一位同学进入教室,然后另一位同学才进入教室 ,为并行)。
此时调用run()方法的话,线程执行过程具体如下图所示:
我们想要并行的结果时,我们需要调用start()方法(start方法中调用了run()方法),运行结果如图:
当我们调用start()方法时效果如图:两个线程会交替执行,具体执行需要看cpu的调度