这里将多线程三种实现方法:1.继承Thread类。2.实现runnable方法。3.线程池。
先说第一种:继承Thread类
为了便于理解,我们假设这样一个场景:我有两只猫,我要给他们同时喂食。
这是猫的类,这个类继承了Thread类
package com.sxj;
public class MyCat extends Thread{
//名字
private String name;
//食物
private String food;
MyCat(String name,String food){
this.name= name;
this.food=food;
}
@Override
public void run() {
for(int i=0;i<100;i++)
System.out.println("今天我给名字叫"+name+"的猫喂"+food);
}
}
下面我要给两只猫喂食,代码如下:
@org.junit.Test
public void main1() {
MyCat cat1 = new MyCat("英短", "m猫粮");
MyCat cat2 = new MyCat("中华田园猫", "米饭");
Thread thread1 = new Thread(cat1);
Thread thread2 = new Thread(cat2);
thread1.start();
thread2.start();
}
我们看一下输出结果:
下面将第二种方法,实现Runnable接口。
同样为了便于理解,我们假设我有两只狗,我要给他们投食。
狗的类如下:
package com.sxj;
public class MyDog implements Runnable{
//狗的名字
private String name;
//狗爱吃的食物
private String food;
MyDog(String name,String food){
this.name=name;
this.food=food;
}
@Override
public void run() {
for(int i=0;i<100;i++)
System.out.println("今天我给名字叫"+name+"的狗喂"+food);
}
}
投食的方法如下:
@org.junit.Test
public void main2() {
MyDog dog1 = new MyDog("哈士奇", "饼干");
MyDog dog2 = new MyDog("中华田园犬", "米饭");
Thread thread1 = new Thread(dog1);
Thread thread2 = new Thread(dog2);
thread1.start();
thread2.start();
}
我们来看下结果:
最后一种方法,线程池实现,我们借用给狗投食的场景,狗类我就不写了,上面有,直接写测试方法:
@org.junit.Test
public void main3() {
ThreadPoolExecutor ex = new ThreadPoolExecutor(2, 2, 100, TimeUnit.MILLISECONDS,
new LinkedBlockingDeque<>());
MyDog dog1 = new MyDog("哈士奇", "饼干");
MyDog dog2 = new MyDog("中华田园犬", "米饭");
ex.execute(dog1);
ex.execute(dog2);
}
看以下实验结果:
好了,以上就是用三种方法实现多线程。同时每种方法都给出了具体的传参的方式,主要就是通过有参构造函数传值。