Java基础__Java中多线程那些事

(未完)

一、测试

查看线程的运行状态

package Cynical_Gary;

public class ThreadState implements Runnable{
    public synchronized void waitForASecond() throws InterruptedException{
        //使当前线程等待0.5秒或其它线程调用notify()或notifyAll()方法
        wait(500);
    }

    public synchronized void waitForYears() throws InterruptedException{
        //使当前现场永久等待,直到其他线程调用notify()或notifyAll()方法
        wait();
    }

    public synchronized void notifyNow() throws InterruptedException{
        //唤醒由调用wait()方法进入等待状态的线程
        notify();
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try{
            //在新线程中运行waitForASecond()方法
            waitForASecond();
            //在新线程中运行waitForYears();方法
            waitForYears();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }

}

ThreadState类

package Cynical_Gary;

public class Gary_Text {

    public static void main(String[] args) throws InterruptedException{
        //创建State对象
        ThreadState state = new ThreadState();
        //利用State对象创建Thread对象
        Thread thread = new Thread(state);
        //输出线程状态
        System.out.println("新建线程:"+thread.getState());
        //启动新线程
        thread.start();
        //输出线程状态
        System.out.println("启动线程:"+thread.getState());
        //当前线程休眠0.1秒,使新线程运行waitForASecond()方法
        Thread.sleep(100);
        //输出线程状态
        System.out.println("计时等待:"+thread.getState());
        //当前线程休眠1秒,使新线程运行waitForYears()方法
        Thread.sleep(1000);
        //输出线程状态
        System.out.println("等待线程:"+thread.getState());
        state.notifyNow();
        System.out.println("唤醒线程:"+thread.getState());
        //当前线程休眠1秒,使新线程结束
        Thread.sleep(1000);
        //输出线程状态
        System.out.println("终止线程:"+thread.getState());
    }

}

/*
 输出:
 新建线程:NEW
启动线程:RUNNABLE
计时等待:TIMED_WAITING
等待线程:WAITING
唤醒线程:RUNNABLE
终止线程:TERMINATED
 */

Text类()测试

package Cynical_Gary;

import java.util.ArrayList;
import java.util.List;

public class Gary_Text {
    //获得根线程组
    private static ThreadGroup getRootThreadGroup(){
        //获得当前线程组
        ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
        while(true){
            //getParent()方法的返回值非空则不是根线程组
            if(rootGroup.getParent()!=null){
            //获得父线程组
            rootGroup = rootGroup.getParent();
            }else{
            //如果达到根线程组则退出循环
                break;
            }
        }
        //返回根线程组
        return rootGroup;
    }

    //获得给定线程组中所有线程名
    public static List<String> getThreads(ThreadGroup group){
        //创建保存线程名的列表
        List<String> threadList = new ArrayList<String>();
        //根据活动线程数穿件线程数组
        Thread[] threads = new Thread[group.activeCount()];
        //复制线程到线程数组
        int count = group.enumerate(threads,false);
        //遍历线程数组将线程名及所在组保存到列表中
        for(int i=0;i<count;i++){
            threadList.add(group.getName()+"线程组:"+threads[i].getName());
        }
        //返回列表
        return threadList;
    }

    //获得给定线程组中子线程
    public static List<String> getThreadGroups(ThreadGroup group){
        //创建保存线程名的列表
        List<String> threadList = getThreads(group);
        //创建线程组数组
        ThreadGroup[] groups = new ThreadGroup[group.activeGroupCount()];
        //复制子线程数组到线程组数据
        int count = group.enumerate(groups,false);
        //遍历所有子线程数组
        for(int i=0;i<count;i++){
            //利用getThreads()方法获得线程名列表
            threadList.addAll(getThreads(groups[i]));
        }
        //返回所有线程名
        return threadList;
    }

    public static void main(String[] args){
        for(String string:getThreadGroups(getRootThreadGroup())){
            //遍历输出列表中的字符串
            System.out.println(string);
        }
    }

}

/*
 输出:
system线程组:Reference Handler
system线程组:Finalizer
system线程组:Signal Dispatcher
system线程组:Attach Listener
main线程组:main
*/

查看JVM中的线程名

原文地址:https://www.cnblogs.com/1138720556Gary/p/9149050.html

时间: 2024-10-08 00:30:32

Java基础__Java中多线程那些事的相关文章

Java基础__Java中常用数学类那些事

(未完) package Cynical_Gary; public class Cynical_Text { public static void main(String[] args){ System.out.println("30°对应的弧度是:"+Math.toRadians(30)); System.out.println("π/6对应的角度是:"+Math.toDegrees(Math.PI/6)); System.out.println("45

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

黑马程序员——Java基础知识之多线程协同

多线程协同 线程间的通讯:对资源的操作动作不同,比如说两个卡车一个拉煤一个装煤,但是他们共享了一个资源. 怎么样把这个资源拿出来?怎样把车装满?这个资源当然是一个类,他里面的组成元素就是对象!!现在我们就要有操作对象的思想了,用对象把这车装满,现在一车装一个对象. 等待唤醒机制: 用的不是sleep是wait.flag标记,这是两人沟通的方式.其实每个标记就要做一次等待或者notify,判断wait,改值notify.线程池.notify唤醒里面的线程,按顺序唤醒.wait和notify必须用在

Java基础教程:多线程基础(2)——线程间的通信

Java基础教程:多线程基础(2)--线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 思维导图 等待中 等待/通知机制 不使用等待/通知机制 我们可以使用使用sleep()与 whle(true) 死循环来实现多个线程间的通信. 虽然两个线程实现了通信,但是线程B必须不断的通过while语句轮训机制来检测某一个条件,这样会浪费CPU资源. 如果轮询间隔较小,更浪费时间间隔.如果轮训

Java基础学习中一些词语和语句的使用

在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看break和continue使用和运行效果的额说明: break:关键字,可以用于任何循环体控制结构,在循环体内执行时,当执行到break时循环会立即终止,并跳到此循环体以后的语句执行. 列如:输出0--10的数当输出到第六位时就不在继续输出了,即是跳出for循环执行for循环体以后的一句. public

java web开发中的奇葩事web.xml中context-param中的注释

同事提交了代码.结果除同事之外,其他人全部编译报错.报错说web.xml中配置的一个bean 没有定义.按照报错提示,各种找,无果. 由于代码全部都是提交到svn主干,之前也没有做过备份,只能一步一步删除同事提交的代码,进行还原. 奇葩事情出现了! <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:/context_entry.xml

Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public class Thread implements Runnable { /* What will be run. */ private Runnable target; ...... /** * Causes this thread to begin execution; the Java Virtu

java基础3:多线程

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

黑马程序员----java基础笔记中(毕向东)

<p>------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! -------</p><p> </p><p>笔记一共记录了毕向东的java基础的25天课程,分上.中.下</p><p>本片为中篇,涵盖11-20天课程</p&