这是我写的一个简单的多线程应用。主要就是创建两个对象,一个是剑姬,一个是剑圣。通过extends Thread和implements Runable的方式创建线程。后续会加上继承其他接口的详细实现。
下图使用visual vm监控线程的结果,在代码中测了每个线程运行的时间,大概在10-30ms之间,然后对其进行休眠,最终得到的结果如下,你可能看到下面进行运行的时间为0,但是时间上没有采集到线程运行的时间,因为运行的时间太短了
不共享资源 --创建多个线程将会执行每个进程(每个任务重复执行run中的内容,每个线程互不干扰)
共享资源 --创建多个线程共享一个任务(即在处理run中任务时,多个线程会对run任务进行分工处理)
注意::线程中不允许用Thread.sleep(线程休眠之后处理会产生冲突)
image
具体代码实现如下:
package com.javabase.thread;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @des 多线程
* @author
* @date 2019/5/13 10:22
*/
public class MultiThread {
public static void main(String[] args) {
//剑姬
Hero jj =new Hero();
jj.setName("剑姬");
jj.setHp(458f);
jj.setType("ad");
jj.setAttackPower(23f);
jj.setAttackSpeed(1000l);
//剑圣
Hero js =new Hero();
js.setName("剑圣");
js.setHp(476f);
js.setType("ad");
js.setAttackPower(27f);
js.setAttackSpeed(1200l);
//thread
new MyThread(jj,js).start();
new MyThread(js,jj).start();
//runable
MyRunable jjAttackJs =new MyRunable(jj, js);
MyRunable jsAttackJj =new MyRunable(js, jj);
new Thread(jjAttackJs,"jjAttackJs,线程1").start();
new Thread(jjAttackJs,"jjAttackJs,线程2").start();
new Thread(jjAttackJs,"jjAttackJs,线程3").start();
new Thread(jjAttackJs,"jjAttackJs,线程4").start();
new Thread(jsAttackJj,"jsAttackJj").start();
}
}
class MyRunableimplements Runnable {
private static final Loggerlogger = LoggerFactory.getLogger(MyRunable.class);
Heroh1;
Heroh2;
public MyRunable(Hero h1, Hero h2) {
this.h1 = h1;
this.h2 = h2;
}
public void run() {
Common common =new Common();
common.myRun(h1,h2);
}
}
class MyThreadextends Thread {
private static final Loggerlogger = LoggerFactory.getLogger(MyRunable.class);
Heroh1;
Heroh2;
public MyThread(Hero h1, Hero h2) {
this.h1 = h1;
this.h2 = h2;
}
public void run() {
Common common =new Common();
common.myRun(h1,h2);
}
}
class Common {
private static final Loggerlogger = LoggerFactory.getLogger(Common.class);
static void myRun(Hero h1,Hero h2) {
while (h2.getHp() >0 && h1.getHp() >0) {
long startTime = System.currentTimeMillis();
// long runtime = 0;
logger.info("{}正在攻击{},---剩余血量:{}", h1.getName(), h2.getName(), h2.getHp());
h2.setHp(h2.getHp() - h1.getAttackPower());
/* try {
Thread.sleep(h1.getAttackSpeed()*10);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
logger.info("线程活动数:{}",Thread.activeCount());
logger.info("运行时间:{}",System.currentTimeMillis()- startTime);
}
if (h2.getHp() <0) {
logger.info("{}已经阵亡", h2.getName());
}
}
}