Android 开发也要掌握的Java并发知识 - 多线程基础2

1.操作系统层面,五种状态

五种状态

各种状态.png

2.Java层面,六种状态

  • 这里主要讲java的六种状态:
    1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
    1. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
      线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
    1. 阻塞(BLOCKED):表示线程阻塞于锁。
    1. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
    1. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
    1. 终止(TERMINATED):表示该线程已经执行完毕。

源码里可以找到

3.不同状态关系

Java线程状态

4.不同状态调用的方法

不同状态直接的切换

5.运行代码尝试一下

  • 线程同时运行,可能结果有一些差异,多执行几遍看看
//创建, Thread.State.NEW
Thread thread1 = new Thread() {
    @Override
    public void run() {
        super.run();
    }
};
 
//线程一直在运行Thread.State.RUNNABLE
Thread thread2 = new Thread() {
    @Override
    public void run() {
        while (true) {
 
        }
    }
};
thread2.start();
 
 
//Thread.State.TERMINATED
Thread thread3 = new Thread() {
    @Override
    public void run() {
        Log.d(TAG, "thread run");
    }
};
thread3.start();
 
//Thread.State.TIMED_WAITING
final Thread thread4 = new Thread() {
    @Override
    public void run() {
        synchronized (object) {
            try {
                TimeUnit.SECONDS.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};
thread4.start();
 
//Thread.State.WAITING
Thread thread5 = new Thread() {
    @Override
    public void run() {
        try {
            thread4.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};
thread5.start();
 
//Thread.State.BLOCKED
Thread thread6 = new Thread() {
    @Override
    public void run() {
        synchronized (object) {
            try {
                TimeUnit.SECONDS.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};
thread6.start();
 
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
 
Log.d(TAG,"thread1 state: "+thread1.getState());
Log.d(TAG,"thread2 state: "+thread2.getState());
Log.d(TAG,"thread3 state: "+thread3.getState());
Log.d(TAG,"thread4 state: "+thread4.getState());
Log.d(TAG,"thread5 state: "+thread5.getState());
Log.d(TAG,"thread6 state: "+thread6.getState());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
of the student you want to query: "); scanf("%s", target); for (int i = 0; i < num;Java线程和Android线程本质上是相同的,都是使用Java语言的线程机制来实现的。Java线程是在Java虚拟机上实现的,而Android线程是在Android操作系统上实现的 i++) { if (strcmp(students[i].id, target) == 0) { printf("Name\tID\tSchool\t。 Java多线程Android多线程也是基本相同的。它们都支持多线程并发执行Score\tAddress\tPhone\n"); printf("%s\t%s\t%s\t%.1f\t%s\t%s\n", students[i].name,可以提高程序的执行效率和响应速度。Java多线程Android多线程都是通过创建多个线程并发执行来实现的,可以使用Java中的Thread类或者Android中的AsyncTask类来创建线, students[i].id, students[i].school, students[i].score, students[i].address, students[i].phone); return; 程。 但是,由于Android操作系统是基于Linux内核的,所以Android线程的实现方式与Java } } printf("Cannot find the student with id %s\n", target); } // 添加专业信息 void add线程有一些不同。例如,在Android中,UI线程(也称为主线程)用于处理用户交Major(Major* majors, int* num) { printf("Enter code: "); scanf("%s", majors[*num].code); 互事件,而在Java中没有这个概念。另外,Android中还有一些特殊的线程类型,例如HandlerThread和IntentService等,用于处理UI事件或者后台操作。 总的来说,Java线程和Android printf("Enter name: "); scanf("%s", majors[*num].name); printf("Enter subject: "); scanf("%s线程基本相同,但是在实现方式上有一些不同,需要根据具体的应用场景来选择适合的线程类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值