草庐IT

Java多线程 -Thread类的常用API

学全栈的灌汤包 2023-11-16 原文

线程常用API

Thread常用API说明:

Thread常用方法:获取线程名称getName()、设置名称setName()、获取当前线程对象currentThread()。

至于Thread类提供的诸如:yield、join、interrupt、不推荐的方法 stop 、守护线程、线程优先级等线程的控制方法,在开发中很少使用,这些方法会在高级篇以及后续需要用到的时候再为大家讲解。

思考: 当有很多线程在执行的时候, 我们怎么去区分这些线程呢?

例如下面代码, 我们创建了两个子线程, 但是两个子线程的打印内容是一样的, 这就导致于我们无法区分两个子线程

public class ThreadDemo {
    public static void main(String[] args) {
        // 创建第一个子线程
        Thread t1 = new MyThread();
        t1.start();

        // 创建第二个子线程
        Thread t2 = new MyThread();
        t2.start();
    }
}

// 创建线程对象
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程输出: " + i);
        }
    }
}

此时需要使用Thread的常用方法:getName()、setName()、currentThread()等。

Thread设置和获取线程名称API:

方法名称说明
getName()获取当前线程的名称,默认线程名称是Thread-索引
setName(String name)将此线程的名称更改为指定的名称,通过构造器也可以设置线程名称

Thread类获取当前线程对象的API(可以通过这个API获取主线程对象):

此方法是Thread类的静态方法,可以直接使用Thread类调用。

这个方法是在哪个线程执行中调用的,就会得到哪个线程对象。

方法名称说明
static Thread currentThread()返回对当前正在执行的线程对象的引用

演示代码:

public class ThreadDemo {
    public static void main(String[] args) {
        Thread t1 = new MyThread();
        // 获取子线程默认名称
        System.out.println(t1.getName()); // Thread-0
        // 设置线程名称
        t1.setName("1号线程");
        t1.start();

        Thread t2 = new MyThread();
        // 获取子线程默认名称
        System.out.println(t2.getName()); // Thread-1
        // 设置线程名称
        t2.setName("2号线程");
        t2.start();

        // 获取当前线程对象(在这里也就是主线程)
        Thread m = Thread.currentThread();
        // 获取主线程默认名称
        System.out.println(m.getName());
    }
}

// 创建线程对象
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            // 拿到线程的名称用于区分
            System.out.println(Thread.currentThread().getName() + "输出: " + i);
        }
    }
}

打印结果如下, 此时我们就可以区分多个子线程

Thread-0
Thread-1
main
1号线程输出: 0
1号线程输出: 1
1号线程输出: 2
2号线程输出: 0
1号线程输出: 3
1号线程输出: 4
2号线程输出: 1
2号线程输出: 2
2号线程输出: 3
2号线程输出: 4

Thread构造器是可以为线程取名字的:

我们可以在子类MyThread中调用父类Thread构造器, 就可以在创建对象时为线程设置名称, 不需要单独调用setName方法

方法名称说明
Thread(String name)可以为当前线程指定名称
Thread(Runnable target)封装Runnable对象成为线程对象
Thread(Runnable target ,String name )封装Runnable对象成为线程对象,并指定线程名称
public class ThreadDemo {
    public static void main(String[] args) {
        // 创建线程时使用构造器设置名称
        Thread t1 = new MyThread("1号线程");
        t1.start();
        Thread t2 = new MyThread("2号线程");
        t2.start();
    }
}

// 创建线程对象
class MyThread extends Thread {
    public MyThread() {
    }

    // 调用父类构造器
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            // 拿到线程的名称用于区分
            System.out.println(Thread.currentThread().getName() + "输出: " + i);
        }
    }
}

Thread类线程的休眠方法

方法名称说明
static void sleep(long time)让当前线程休眠指定的时间后再继续执行,单位为毫秒。

例如我们用主线程来演示, 当for循环中i=3时, 让主线程休眠三秒后, 再运行

public static void main(String[] args) throws Exception {
    for (int i = 0; i < 10; i++) {
        System.out.println(i);
        if (i == 3) {
            Thread.sleep(3000);
        }
    }
}

有关Java多线程 -Thread类的常用API的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  5. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  8. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐