多线程调⽤同⼀个对象的⽅法_深⼊理解多线程(⼀)深⼊理解多线程(⼀)
1.多线程的原理
1.1 代码展⽰多线程
为了演⽰多线程,我们⽤⼀个代码来展⽰多线程的效果:
public class App {
public static void main(String[] args) throws InterruptedException {
//⼦线程
new Thread(() -> {
for (int i = 0; i < 20; i++) {一个线程可以包含多个进程
System.out.println(Thread.currentThread().getName()+":⼩强");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
//主线程
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+":旺财");
Thread.sleep(100);
}
}
}
流程图:
程序启动运⾏main时候,java虚拟机启动⼀个进程,主线程main在main()调⽤时候被创建。随着调⽤Thread的对象的start⽅法,另外⼀个新的线程也启动了,这样,整个应⽤就在多线程下运⾏。 通过这张图我们可以很清晰的看到多线程的执⾏流程。
1.2 图解多线程时内存状态图
多线程执⾏时,在栈内存中,其实每⼀个执⾏线程都有⼀⽚⾃⼰所属的栈内存空间
每⼀个执⾏线程都有⼀⽚⾃⼰所属的栈内存空间。进⾏⽅法的压栈和弹栈。
jvm虚拟机中,堆中放的是对象和数据,栈中放的是⽅法,⽅法区中放的是class类⽂件2. 创建线程的两种⽅法
2.1 继承Thread类
public class MyThread extends Thread{
public MyThread(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("⼩强");
}
}
}
//调⽤
new MyThread("myThread").start
2.2 实现Runable接⼝
public class MyThread implements Runnable{
@Override
public void run() {
System.out.println("myThread");
}
}
/
/调⽤
Thread thread=new Thread(new MyThread());
thread.start()
我们更倾向于使⽤匿名内部类:
new Thread(() -> {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+":⼩强");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
通过实现Runnable接⼝,使得该类有了多线程类的特征。run()⽅法是多线程程序的⼀个执⾏⽬标。所有的多线程代码都在run⽅法⾥Thread类实际上也是实现了Runnable接⼝的类。在启动多线程的时候,需要先通过Thread类的构造⽅法Thread(Runnable
⾯。Thread类实际上也是实现了Runnable接⼝的类
target) 构造出对象,然后调⽤Thread 对象的start()⽅法来运⾏多线程代码。实际上所有的多线程代码都是通过运⾏Thread的start()⽅法来运⾏的。因此,不管是继承Thread类还是实现Runnable接⼝来实现多线程,最终还是通过Thread的对象的API来控制线程的
2.3 两者的优劣
如果⼀个类继承Thread,则不适合资源共享。但是如果实现了Runable接⼝的话,则很容易的实现资源共享。
总结:
继承Thread类所具有的优势:
实现Runnable接⼝⽐继承Thread
实现Runnable接⼝
1. 适合多个相同的程序代码的线程去共享同⼀个资源。
2. 可以避免java中的单继承的局限性。
3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独⽴。
4. 线程池只能放⼊实现Runable或Callable类线程,不能直接放⼊继承Thread的类。
扩充:在java中,每次程序运⾏⾄少启动2个线程。⼀个是main线程,⼀个是垃圾收集线程。因为每当使⽤java命令执⾏⼀个类的时候,实际上都会启动⼀个JVM,每⼀个JVM其实在就是在操作系统中启动了⼀个进程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论