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线程在等待他自己挂掉,也就是死锁么。

main线程打印100此次“main”,新线程打印50次“new”。

9、通过实现Runnable接口的方式创建一个新线程,要求main线程打印100此次“main”,新线程打印50次“new”。 public class MyRunnable implements R...
  • xiaoye142034
  • xiaoye142034
  • 2017-09-30 13:47:57
  • 981

main是一个线程

package cm.com.show; //main是一个线程 public class MainThread { public static void main(String[] a...
  • pangqiandou
  • pangqiandou
  • 2016-09-09 16:20:33
  • 180

Java守护线程和main线程整理

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

java中main方法启动的是一个进程还是一个线程

是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后,进程启...
  • Truong
  • Truong
  • 2015-09-30 13:45:26
  • 3942

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

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

java 启动线程三种方式

1.继承Thread public class java_thread extends Thread{ public static void main(String args[]) { (n...
  • typename
  • typename
  • 2012-01-20 16:32:01
  • 94953

你真的了解JAVA中的main方法吗?

[java] view plain copy public static void main(String[] args) {}   或者 ...
  • CarryBest
  • CarryBest
  • 2017-04-19 20:23:54
  • 2544

在Eclipse中测试Main函数运行出现Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:0

在对JAVA中Main函数以及参数String[] args比较迷惑的情况下, 找了百度问了问,得到一个测试的例子  package com.hello; public class HelloW...
  • flyhigh200703
  • flyhigh200703
  • 2012-10-31 15:59:39
  • 9386

AndroidSchedulers.mainThread()无法切换到主线程,原来是细节问题啊

Observable.create(new Observable.OnSubscribe() { @Override pub...
  • a1274624994
  • a1274624994
  • 2016-11-23 21:04:00
  • 3147

ActivityThread的main方法究竟做了什么?

ActivityThread的main方法究竟做了什么? 本文原创,转载请经过本人准许。 写在前面:在暴雨天能去上课的都是好学生,能去上班的都是游泳运动员~问大家一个问题:Android中一个应用...
  • MeloDev
  • MeloDev
  • 2016-07-20 13:41:02
  • 3581
收藏助手
不良信息举报
您举报文章:Java中的Main线程
举报原因:
原因补充:

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