前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java多线程实战(后续还会更新)

java多线程实战(后续还会更新)

作者头像
gfu
发布2019-08-28 13:42:37
5060
发布2019-08-28 13:42:37
举报
文章被收录于专栏:gfugfu

这是我写的一个简单的多线程应用。主要就是创建两个对象,一个是剑姬,一个是剑圣。通过extends Thread和implements Runable的方式创建线程。后续会加上继承其他接口的详细实现。


下图使用visual vm监控线程的结果,在代码中测了每个线程运行的时间,大概在10-30ms之间,然后对其进行休眠,最终得到的结果如下,你可能看到下面进行运行的时间为0,但是时间上没有采集到线程运行的时间,因为运行的时间太短了

  • 继承线程类 extands Thread

不共享资源 --创建多个线程将会执行每个进程(每个任务重复执行run中的内容,每个线程互不干扰)

  • 实现Runable接口 implements Runable

共享资源 --创建多个线程共享一个任务(即在处理run中任务时,多个线程会对run任务进行分工处理)

注意::线程中不允许用Thread.sleep(线程休眠之后处理会产生冲突)

image

具体代码实现如下:

代码语言:javascript
复制
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());

        }

}

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.07.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档