线程简要理解
进程:可执行文件或者程序,例如.exe
线程:进程的执行单元或者路径。
(车看做进程,线程就是马路,单线程就是单行道,多线程就是多行道)
多线程软件:QQ,微信,就是你和别人聊天的同时,还能和另一个人聊天,能够同时进行多个事情。
一个电脑上可以有多个进程,这些进程之间的数据时隔离的。(我用qq发给你的信息,你只能用qq接收,而不能用微信接受)
一个进程可以有多个线程,这些线程之间共享当前进程的数据
常见面试题
多线程并行和并发的区别:
多线程并行:多个进程同时执行,前提是:需要多核CPU
多线程并发:多个线程同时请求执行,但CPU同时只能执行一个,于是就安排这些线程交替执行,由于时间非常短,所以我们看起来就像是同时执行的,其实并不是。
多线程的实现两种方式一
区别:
方式一:继承Thread类。好处:代码相对比较简单,因为是直接继承Thread类,所以可以直接使用Thread类中的方法。弊端:扩展性较差,因为是继承了Thread类,就不能继承别的类了。
方式二:实现Runnable接口。好处:扩展性较强。弊端:代码相对比较繁琐。
方式一:
package thread;
public class TestThread {
/*
* 多线程的实现方式一:
* 1、定义一个类(MyThread)去继承Thread
* 2、重写Thread#run()方法,并把要执行的代码写入到run中
* 3、创建线程对象
* 4、开启线程
* 注意:
* a、开启线程用的是start()方法
* b、同一线程不能重复开启,虽然编译会通过,但是会报“线程状态非法异常”
* IllegalThreadStateException
* 多线程执行具有:随机性,延迟性。原因是CPU做着高效的切换
* 即每次执行效果是不一样的
*/
public static void main(String[] args){
MyThread mt = new MyThread();
//开启线程调用的是start()方法,并且不能重复开启,而且也不是调用run()方法
//mt.run();这样写也不会报错,但不是多线程程序。
mt.start();
for(int i=0;i<200;i++){
System.out.println("我是正在进行main~~~~~"+i);
}
}
}
package thread;
public class MyThread extends Thread {
@Override
public void run() {
for(int i=0;i<300;i++){
System.out.println("我是正在进行的另一个线程~~~~~"+i);
}
}
}
方式二:
实现原理解析
MyRunnable mr = new MyRunnable();
Thread th = new Thread(mr);
th.start();//th.start(),此时调用的不是Thread的run方法,而是重写Runnable的run()方法
/*
* 原因就是实现Runnable接口的原理
* 简化实现原理代码如下
*/
public class Thread{
private Runnable target;
public Thread(Runnable target) {
this.target = target;
}
public void run(){
if(target!=null){
target.run();//多态原理,调用的是非静态的方法,遵循编译看左运行看右
}
}
}
正式实现代码如下:
package thread;
public class TestThread2 {
/*
* 多线程的实现方式二:
* 1、定义一个类(MyRunnable)去实现Runnable
* 2、重写Runnable#run()方法,并把要执行的代码写入到run中
* 3、创建Runnable接口的子类对象,将其作为参数传入到Thread类的构造中,创建线程对象
* 4、开启线程
* 注意:
* a、开启线程用的是start()方法
* b、同一线程不能重复开启,虽然编译会通过,但是会报“线程状态非法异常”
* IllegalThreadStateException
* 多线程执行具有:随机性,延迟性。
* 即每次执行效果是不一样的
*/
public static void main(String[] args) {
//创建Runnable接口的子类对象,
MyRunnable mr = new MyRunnable();
//将其作为参数传入到Thread类的构造中,创建线程对象
//方式一种是Mythread创建对象,其调用的是Thread的无参构造,这里使用的是有参构造
Thread th = new Thread(mr);
th.start();
for(int i=0;i<200;i++){
System.out.println("我是正在进行main~~~~~"+i);
}
}
}
package thread;
public class MyRunnable implements Runnable {
@Override
public void run() {
for(int i=0;i<300;i++){
System.out.println("我是正在Runnable~~~~~"+i);
}
}
}