Java中的Main线程

翻译 2017年07月05日 11:22:46

原文地址:http://www.geeksforgeeks.org/main-thread-java/

Java对多线程编程提供了内置的支持。一个多线程程序可以包含两个或者更多的并发部分。每一部分都称为一个线程,而且每个线程都定义为一个独立的执行路径。

Main Thread

当一个Java程序启动以后,有一个线程就会立马跑起来。这就是通常所说的Main线程,因为当我的程序一启动,它就开始执行了。

属性

  • 大量其他的子线程都是从它这里产生的
  • 通常它都是最后一个结束执行的线程,因为它要做各种关闭的动作

流程图


这里写图片描述

如何控制main线程

当我们的程序启动以后,Main线程就自动被创建出来了。想要控制它,我们就得获取一个它的引用。这个可以通过调用currentThread()来做到,这个方法是在Thread类中。这个方法返回一个当前正在被调用的线程的引用。main线程的默认优先级是5,其他剩下的用户线程优先级都是子类继承基类。

// Java program to control the Main Thread
public class Test extends Thread {
    public static void main(String[] args) {
        // getting reference to Main thread
        Thread t = Thread.currentThread();

        // getting name of Main thread
        System.out.println("Current thread: " + t.getName());

        // changing the name of Main thread
        t.setName("Geeks");
        System.out.println("After name change: " + t.getName());

        // getting priority of Main thread
        System.out.println("Main thread priority: " + t.getPriority());

        // setting priority of Main thread to MAX(10)
        t.setPriority(MAX_PRIORITY);

        System.out.println("Main thread new priority: " + t.getPriority());

        for (int i = 0; i < 5; i++) {
            System.out.println("Main thread");
        }

        // Main thread creating a child thread
        ChildThread ct = new ChildThread();

        // getting priority of child thread
        // which will be inherited from Main thread
        // as it is created by Main thread
        System.out.println("Child thread priority: " + ct.getPriority());

        // setting priority of Main thread to MIN(1)
        ct.setPriority(MIN_PRIORITY);

        System.out.println("Child thread new priority: " + ct.getPriority());

        // starting child thread
        ct.start();
    }
}

// Child Thread class
class ChildThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("Child thread");
        }
    }
}

输出:

Current thread: main
After name change: Geeks
Main thread priority: 5
Main thread new priority: 10
Main thread
Main thread
Main thread
Main thread
Main thread
Child thread priority: 10
Child thread new priority: 1
Child thread
Child thread
Child thread
Child thread
Child thread

main方法和Main线程之间的关系

对于每一个程序,Main线程都是由Java虚拟机创建的。Main线程首先要验证main()方法的存在,然后初始化这个类。注意从JDK 6开始main()被强制是一个独立的应用程序。

main线程的死锁(只有单个线程)

我们可以仅仅利用Main线程来创建一个死锁,例如,只用一个线程,下面的Java代码做了演示:

// Java program to demonstrate deadlock
// using Main thread
public class Test {
    public static void main(String[] args) {
        try {

            System.out.println("Entering into Deadlock");

            Thread.currentThread().join();

            // the following statement will never execute
            System.out.println("This statement will never execute");

        }

        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出:

Entering into Deadlock

解释

Thread.currentThread().join()的声明就告诉Main线程要等待这个线程(例如等待自己)。因此Main线程在等待他自己挂掉,也就是死锁么。

Java中的main线程是不是最后一个退出的线程

Java中的main线程是不是最后一个退出的线程 个人blog原文地址:http://www.gemoji.me/when_main_thread_end/  之所以写这篇文章,是因为...
  • anhuidelinger
  • anhuidelinger
  • 2013年08月27日 19:31
  • 10573

Java守护线程和main线程整理

Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存...
  • qq_33098039
  • qq_33098039
  • 2017年10月09日 09:40
  • 216

Java中的main线程是不是最后一个退出的线程

Java中的main线程是不是最后一个退出的线程 个人blog原文地址:http://www.gemoji.me/when_main_thread_end/  之所以写这篇文章,是因为...
  • anhuidelinger
  • anhuidelinger
  • 2013年08月27日 19:31
  • 10573

java前台线程和后台线程

一.  java中的后台线程:       java线程大家都不陌生,可以用继承Thread类或者实现Runable接口来定义一个自己的线程。另外,java线程还可以分为前台线程(也称用户线程或普通线...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2014年03月25日 22:56
  • 1886

java多线程学习(一)之创建线程的两种方式

1、首先来了解一下线程和进程的概念    进程的概念:    进程是操作系统资源管理的最小单位,进程是一个动态的实体,他是程序的一次执行过程。也叫作一个控制单元    线程的概念:    线程是进程中...
  • u011521890
  • u011521890
  • 2015年12月03日 15:43
  • 2416

main线程会比其他线程优先结束

最近在学习volatile时,看到一篇文章关于使用volatile进行同步同步控制利用线程实现计数器,代码如下: public class Main{ private static int...
  • yteui2010
  • yteui2010
  • 2017年08月02日 13:14
  • 77

如何停止一个线程

停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安...
  • Android_I_lOVE
  • Android_I_lOVE
  • 2017年11月08日 11:05
  • 63

线程的start()方法和run()方法的区别

下面这段代码给出了详细的queb
  • likaiwalkman
  • likaiwalkman
  • 2014年06月16日 22:35
  • 425

Java通过Executors提供四种线程池

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 new...
  • mack415858775
  • mack415858775
  • 2016年05月26日 17:03
  • 1957

关于线程wait方法

今天遇到疑问,为什么如上图的线程不能唤醒wait。于是去CSDN提问和自己查资料,原来我这里只有一个线程,这里应该至少有两个同步的线程。于是我把代码改成这样。 这样,线程0就可以被唤醒。执行完。...
  • san_dunfan
  • san_dunfan
  • 2015年03月16日 17:36
  • 729
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中的Main线程
举报原因:
原因补充:

(最多只允许输入30个字)