精华内容
下载资源
问答
  • 2018-08-30 23:21:51

    这篇学习关于Thread类的两个方法,第一个是获取当前线程对象,返回的是一个Thread对象。第二个方法是我们自动化中经常使用的,线程休眠。

    1.currentThread()

    获取的是当前线程对象,是对象不是对象名称,如果要获取名称,需要对象.getName()实现。

    package thread;
    
    public class Demo5_Thread {
    
    	public static void main(String[] args) {
    		
    		new Thread() {
    			public void run() {
    				System.out.println(this.getName() +": aaaaa");
    			}
    		}.start();
    		
    		new Thread(new Runnable() {
    			
    			public void run() {
    				System.out.println(Thread.currentThread().getName()+": bbbb");
    			}
    		}).start();
    		
    		//main方法打印线程名称
    		System.out.println(Thread.currentThread().getName());
    	}
    
    }
    

    运行结果:

    Thread-0: aaaaa
    main
    Thread-1: bbbb
    

    这个打印结果,也说明了,多线程中,main方法本身就是一个单独线程执行,而且执行顺序并不会像代码写的从上往下的顺序。

    2.线程休眠

    休眠就是让线程停顿下来,支持不同时间单位的中断。这个方法是Thread.sleep(xxx毫秒)。我们写自动化脚本经常需要用到它。

    package thread;
    
    public class Demo5_Thread {
    
    	public static void main(String[] args) throws InterruptedException {
    		
    		new Thread() {
    			public void run() {
    				for(int i = 0; i< 10; i ++) {
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e) {
    						
    						e.printStackTrace();
    					}
    					System.out.println(this.getName() +": aaaaa");
    				}
    				
    			}
    		}.start();
    		
    		new Thread(new Runnable() {
    			
    			public void run() {
    				for(int i = 0; i< 10; i ++) {
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e) {
    						
    						e.printStackTrace();
    					}
    					System.out.println(Thread.currentThread().getName()+": bbbb");
    				}
    				
    			}
    		}).start();
    		
    		//main方法打印线程名称
    		System.out.println(Thread.currentThread().getName());
    	}
    
    }
    

    运行之后,可以看到间隔一秒输出一个。

    更多相关内容
  • Java如何获取当前线程

    万次阅读 2018-07-05 08:26:48
    Java 中经常会遇到要获取当前线程的情况,这时一般我们就会通过Thread.currentThread()来获取,接下去就看看执行该语句在 JVM 中做了什么吧。 简单例子 以下是一个简单的例子,获取当前线程并打印线程名称,输出...

    前言

    Java 中经常会遇到要获取当前线程的情况,这时一般我们就会通过Thread.currentThread()来获取,接下去就看看执行该语句在 JVM 中做了什么吧。

    简单例子

    以下是一个简单的例子,获取当前线程并打印线程名称,输出是”main”,即主线程。

    public class CurrentThreadTest {
    
        public static void main(String[] args) {
            Thread t = Thread.currentThread();
            System.out.println(t.getName());
        }
    
    }

    currentThread方法

    在 Thread 类中,currentThread是一个静态且本地方法。

    public static native Thread currentThread();

    Thread.c

    Java 层声明的本地方法对应实现在 Thread.c 中,currentThread是一个注册到 JVM 中的方法,它与 JVM 中的JVM_CurrentThread函数绑定了,所以实现逻辑在JVM_CurrentThread函数里。逻辑为:
    * JVMWrapper("JVM_CurrentThread")用于调试。
    * 通过thread->threadObj()获取 oop,这里的 thread 是在JNI_ENTRY宏中获取到的,详细情况可参考后面的JNI_ENTRYJNI_END宏。
    * 调用JNIHandles::make_local函数

    #define THD "Ljava/lang/Thread;"
    
    static JNINativeMethod methods[] = {
        ...
        {"currentThread",    "()" THD,     (void *)&JVM_CurrentThread},
        ...
    };
    
    JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
      JVMWrapper("JVM_CurrentThread");
      oop jthread = thread->threadObj();
      assert (thread != NULL, "no current thread!");
      return JNIHandles::make_local(env, jthread);
    JVM_END

    make_local函数中主要看thread_from_jni_environment函数,它用于获取当前线程,它的逻辑为JavaThread *thread_from_jni_env = (JavaThread*)((intptr_t)env - in_bytes(jni_environment_offset()));,即直接通过地址偏移来做减法计算得到JavaThread*,这是因为 JavaThread 对象包含了 JNIEnv 对象属性,所以可以通过JNIEnv*与偏移做减法来算出JavaThread*。最后还要检查线程是否已经终止状态,没有终止才返回该线程对象。

    获取到JavaThread*对象后,分配句柄并将 oop 赋给句柄,并且转成 Java 层的对象 jobject。

    jobject JNIHandles::make_local(JNIEnv* env, oop obj) {
      if (obj == NULL) {
        return NULL;                
      } else {
        JavaThread* thread = JavaThread::thread_from_jni_environment(env);
        assert(Universe::heap()->is_in_reserved(obj), "sanity check");
        return thread->active_handles()->allocate_handle(obj);
      }
    }
    
    static JavaThread* thread_from_jni_environment(JNIEnv* env) {
        JavaThread *thread_from_jni_env = (JavaThread*)((intptr_t)env - in_bytes(jni_environment_offset()));
        if (thread_from_jni_env->is_terminated()) {
          thread_from_jni_env->block_if_vm_exited();
          return NULL;
        } else {
          return thread_from_jni_env;
        }
      }

    JNI_ENTRYJNI_END

    这两个宏将共同的部分都抽离出来了。其中JNI_END比较简单,就两个结束大括号。

    #define JNI_ENTRY(result_type, header)  JNI_ENTRY_NO_PRESERVE(result_type, header)    WeakPreserveExceptionMark __wem(thread);
    
    #define JNI_END } }

    JNI_ENTRY主要逻辑:
    * 获取当前执行线程 JavaThread 指针对象。
    * 创建 ThreadInVMfromNative 对象。
    * TRACE_CALL ,这里什么都不干。
    * 创建 HandleMarkCleaner 对象。
    * 将 thread 赋值给 Exceptions 中的 THREAD。
    * 校验栈对齐。
    * 创建 WeakPreserveExceptionMark 对象。

    #define JNI_ENTRY_NO_PRESERVE(result_type, header)                   \
    extern "C" {                                                         \
      result_type JNICALL header {                                       \
        JavaThread* thread=JavaThread::thread_from_jni_environment(env); \
        assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \
        ThreadInVMfromNative __tiv(thread);                              \
        debug_only(VMNativeEntryWrapper __vew;)                          \
        VM_ENTRY_BASE(result_type, header, thread)
    
    #define VM_ENTRY_BASE(result_type, header, thread)                   \
      TRACE_CALL(result_type, header)                                    \
      HandleMarkCleaner __hm(thread);                                    \
      Thread* THREAD = thread;                                           \
      os::verify_stack_alignment();      

    ————-推荐阅读————

    我的2017文章汇总——机器学习篇

    我的2017文章汇总——Java及中间件

    我的2017文章汇总——深度学习篇

    我的2017文章汇总——JDK源码篇

    我的2017文章汇总——自然语言处理篇

    我的2017文章汇总——Java并发篇


    跟我交流,向我提问:

    这里写图片描述

    公众号的菜单已分为“读书总结”、“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

    为什么写《Tomcat内核设计剖析》

    欢迎关注:

    这里写图片描述

    展开全文
  • // 如果设置此值,线程执行完毕,会等keepAliveTime时长,如果还没有任务执行,线程池中线程就关闭了 executor.prestartAllCoreThreads(); // 预启动所有核心线程 try { Thread.sleep(10 * 1000); } catch ...

    1.代码样例

    int corePoolSize = 2;
        int maximumPoolSize = 4;
        long keepAliveTime = 20;
        TimeUnit unit = TimeUnit.SECONDS;
        ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
            keepAliveTime, unit, new ArrayBlockingQueue<>(10), new NameTreadFactory(),
            new ThreadPoolExecutor.CallerRunsPolicy());
    //    executor.allowCoreThreadTimeOut(true);
     // 如果设置此值,线程执行完毕,会等keepAliveTime时长,如果还没有任务执行,线程池中线程就关闭了
        executor.prestartAllCoreThreads(); // 预启动所有核心线程
        try {
          Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        System.out.println("开始任务-------------------");
        for (int i = 0; i < 20; i++) {
          Task task = new Task(i);
          executor.execute(task);
        }
        System.out.println("结束任务--------------------------");
    
        try {
          Thread.sleep(300 * 1000);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        executor.shutdown();
    
    
    
    public class NameTreadFactory implements ThreadFactory {
    
        private final AtomicInteger mThreadNum = new AtomicInteger(1);
    
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());
            System.out.println(t.getName() + " has been created");
            return t;
        }
    }

     

    2.如使用默认的线程池,任务执行完毕,线程池中会保持核心线程池的个数(2个)处于等待状态 waiting。

     

     

     

    3.如果设置了

    executor.allowCoreThreadTimeOut(true)

    任务执行完了,最大线程个数(4个)的线程同时进入timed_waiting 状态,到了keepAliveTime 时间,线程池中就没有线程了。如果有任务来了,在时间限定内复用线程,如果超过时间重新创建线程。任务执行完成,和之前一样!

     

    展开全文
  • python线程状态

    千次阅读 2021-01-13 18:01:32
    python怎么判断线程状态python中如何在父线程中检测其子线程是否处于运行状态线程有一个方法 is_alive() 运行时会返回Bool值Truepython 在线程函数中如何实现线程的暂停、恢复和终我们都知道python中可以是...

    python怎么判断线程的状态

    python中如何在父线程中检测其子线程是否处于运行状态

    子线程有一个方法 is_alive() 运行时会返回Bool值True

    python 在线程函数中如何实现线程的暂停、恢复和终我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一

    python如何获取进程和线程状态

    threading.active_count() Return the number of Thread objects currently alive. The returned count is equal to the length of the list returned by enumerate(). active_count可以返回当前活动的线程枚举 我一般是这么用的 def getHeatsPa

    Python 多线程效率不高吗?

    Python效率到底高不高?到底是不是鸡肋?Python由于有全锁局的存在(同一时间只能有一个线程执行),并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,相反还可能会因为线程的频繁切换。

    python多线程怎样执行函数

    正常执行 但是线程运行状态不受函数的控制

    简述python进程,线程和协程的区别及应用场景

    协程多与线程进行比较 1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。 2) 线程进程都是同步机制,而协程则是异步 3) 协程能保留上一次调用时的状态,每次过程重入时。

    为什么python多线程这么慢

    差不多是这样子。多线程目前仅用于网络多线程采集, 以及性能测试。 其它的语言也有类似的情况,线程本身的特点导致线程的适用范围是受限的。只有CPU过剩,而其它的任务很慢,此时用线程才是有益的,可以很好平衡等待时间,提高并发性能。

    python3 创建线程时不用args传参,执行线程时为什如果创建线程时在target里就传入了参数,为什么在启动线程时,线程不是在Python多线程下,每个线程的执行方式:

    执行代码直到sleep或者是python虚拟机将其挂起。

    释放GIL 可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。

    我是用 函数 包装的 线程,如何判断 子线程的 状态(运行?非运行?)? threading.active_count() Return the number of Thread objects currently alive. The returned count is equal to the length of the list returned by enumerate(). active_count可以返回当前活动的线程枚举 我一般是这么用的 def getHeatsPa

    展开全文
  • 获取线程池中任务执行数量

    千次阅读 2021-03-03 12:14:01
    通过线程池进行任务处理,有时我们需要知道线程池中任务的执行状态。通过ThreadPoolExecutor的相关API实时获取线程数量,排队任务数量,执行完成线程数量等信息。实例private static ExecutorService es = new ...
  • java线程状态获取线程基本信息

    千次阅读 2021-02-12 13:40:40
    1. 线程状态新生状态用 new 关键字建立一个线程后,该线程对象就处于新生...当系统选定一个等待执行的线程后,它就会从就绪状态进入执行状态,该动作称为“CPU 调度”。运行状态运行状态的线程执行自己的 run 方法...
  • 1.获取线程的名称 参考:https://blog.csdn.net/luyaran/article/details/80595772  public class Main extends Thread {  public static void main(String[] args) {  Main t1 = new Main();  t1.setName(&...
  • 线程 NSThread 多线程 获取当前线程

    万次阅读 2014-02-21 18:55:19
    线程 NSThread 多线程 线程与进程 进程 是一个活动的程序,一个容器 ...一个NSThread对象在程序中控制一个线程,当你有很多任务需要执行,但又不想阻塞主线程时, 多线程将会很有用。运用多线程可以同时执行多个任务。
  • 获取当前正在运行的所有线程

    千次阅读 2018-08-31 14:49:44
    private Thread[] findAllThreads() { ThreadGroup group = Thread.currentThread().getThreadGroup(); ThreadGroup topGroup = group;... /* 遍历线程组树,获取线程组 */ while (group != null) { t...
  • 我们在做多线程的时候,想要查看下当前线程池有多少活动的线程,如何获取呢? 请看下面做的例子即可得到: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java....
  • 详细介绍了Java线程的6种状态,以及状态之间的转换。
  • 线程的几种状态转换

    千次阅读 2020-12-21 11:49:03
    线程在一定条件下,状态会发生变化。线程一共有以下几种状态:1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他...3、运行状态(Running):就绪状态线程获取了CPU,执行程...
  • 必学多线程
  • Python-线程

    千次阅读 2020-12-10 21:15:55
    1.线程Python中使用线程有两种方式:函数或者用类来包装线程对象。1.函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下:thread.start_new_thread(function,args[,kwargs])参数说明:function ...
  • 线程状态和基本操作

    万次阅读 多人点赞 2019-10-03 23:36:42
    在上一篇博客中并发编程的优...文章目录创建线程的四种方式线程状态和生命周期线程状态的基本操作interruptedjoinsleepyield进程和线程线程优先级守护线程和用户线程守护线程详解线程死锁认识线程死锁如何避免线...
  • 现在 Java 面试,基本上都会问到多线程,那么随之而来的线程状态,很多时候都会被问到,大部分人都知道线程的几种状态,但是让你整体全部串起来,做到面试时游刃有余,估计很多人记忆不是很清晰。 今天武哥就把这些...
  • java线程的五大状态,阻塞状态详解

    千次阅读 2020-08-17 09:45:54
    一、状态简介 ...当这个语句执行的时候,线程创建,开辟工作空间,也就是线程进入了新生状态。 2.2 就绪状态 普通情况,一旦调用了: t.start(); start 方法被调用,线程立即进入了就绪状态,表示这个线程
  • VS C++ 线程篇之五线程状态

    千次阅读 2018-03-25 19:01:36
    挂起线程线程挂起的个数由宏 ...注意:挂起当前线程时,如果存在堆操作,可能就会把堆锁死,其他线程就不能操作该堆。DWORD WINAPI SuspendThread( __in HANDLE hThread );挂起之后恢复恢复后就进入 就绪态DWORD WI...
  • java指令-jstack查看当前程序线程状态

    千次阅读 2017-02-15 10:21:31
    java指令-jstack查看当前程序线程状态
  • 题目要求:创建三个线程,每个线程分别打印ABC,并按照ABC的顺序执行十次 题目可以使用多种不同的方式解决,下面我们分别使用 Condition 等待唤醒机制、Semaphore 信号量、CountDownLatch 闭锁、Thread.join() 方法...
  • 线程的六种状态及其状态的转换

    万次阅读 2018-10-04 18:15:26
    1.线程自身信息 线程运行的过程会产生很多信息,这些信息都保... 线程的优先级:getPriority,线程优先级从1-10,其中数字越大表示优先级别越高,同时获得JVM调度执行的可能性越大,JDK内置了三种常见的状态: //...
  • 线程、并发/并行、自定义线程类、线程安全、线程状态、线程池
  • MySQL线程状态详解

    千次阅读 2021-04-11 23:03:08
    文章目录一、show processlist二、command命令类型三、用户线程状态 一、show processlist Id:连接进程标识符。是由 CONNECTION_ID() 函数返回的值 User:执行语句的 MySQL 用户名称。如果显示的是“system user”...
  • 在编程工作中,我们经常...接下来我们会映照上图介绍多线程执行过程中经历的五种状态: 1. 新建状态: 新建状态就是我们通过new关键字实例化出一个线程类的对象时的状态。 public class IsAThread extends Thre...
  • 文章目录实例描述实现过程代码...当线程需要获得对象的内置锁,而该锁正被其他线程拥有时,线程处于阻塞状态;当线程等待其他线程通知调度表可以运行时,该线程处于等待状态;当run()方法运行完毕或出现异常时,线...
  • 线程(并发执行

    千次阅读 2020-08-02 15:06:54
    ​ 当系统有一个以上CPU时,同一时刻,当一个CPU在执行一个任务时,另一个CPU在执行另一个任务,两个任务互不抢占CPU资源,可以同时进行(多核CPU,一个CPU执行一个进程) 并发 ​ 一个CPU,同一时间,有多个任务在...
  • 文章目录从源码看Thread中定义的六种线程状态 从源码看Thread中定义的六种线程状态
  • 获取Java线程转储的常用方法

    万次阅读 2021-01-07 21:26:48
    线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。 线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。 Java中的线程模型, 直接使用了操作系统的线程...
  • 线程各种状态及转换

    千次阅读 2018-08-23 10:16:58
    java中,线程状态使用一个枚举类型来描述的。这个枚举一共有6个值: NEW(新建)、RUNNABLE(运行)、BLOCKED(锁池)、TIMED_WAITING(定时等待)、WAITING(等待)、TERMINATED(终止、结束)。   一、大多数人对线程状态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 606,079
精华内容 242,431
关键字:

如何获取当前线程的执行状态