多线程回顾-01

好久没法推文了,因为这次疫情的原因,小编也是没能去上学,已经待在家好一阵了,一直想写下推文,但是不知道些什么,看了看之前的板块,我打算先把砌砖系列先完善一下,所以今天先和大家回顾一下Java多线程的一些基础知识,并演示一下我写的一些程序。
多线程部分我打算分两个部分:第一部分介绍多线程的基本概念及线程如何构造,第二部分我们介绍多线程之间存在的问题及处理方式。
接下来,我们进入今天的正题–多线程的基本概念及线程如何构造
说到多线程,不得不先说下多进程,进程和线程虽一字之差,但是是不同的概念。我们先给出进程和线程的定义,再详细分析二者的区别与联系。
进程是一个程序关于某个数据集合的一次执行过程,是操作系统进行资源的分配和保护的基本单位。
线程是进程中能够独立执行的实体,是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程允许包含多个并发执行的线程。同一个线程的所有线程共享进程进程所获得的内存空间和资源,但不拥有资源。
从定义中看,进程包括的范围比线程更大,一个进程可以包含许多个并发执行的线程,也就是说,CPU每时刻执行一个进程的时候,其实就是在调度和处理该进程中并发执行的线程。
线程有五种状态:新建、就绪、运行、阻塞、终止。线程创建后处于就绪态,获得处理器时处于运行态,运行中因等待条件处于阻塞态。
关于线程的调度,由于任意时刻只能有一个线程能够占用处理器运行,当有多个线程处于就绪态时,它们排队等待处理资源。因此,需要进行线程调度。线程调度采用的是剥夺方式,剥夺方式主要有两个原则:一是高优先级线程可以剥夺低优先级线程运行,线程的优先级描述线程执行的优先程度。二是当运行线程时间使用完后被剥夺处理器。这种线程调度原则(剥夺式原则)可以避免一个线程长时间独占处理器,给线程提供较好的服务。
下面我们说一下在java中多线程的构造方法。
Java中构造多线程的方法主要有两种:Runnable接口和Thread类,其中Runnable接口约定线程的执行方法(即run()方法),Thread类提供创建、管理和控制线程对象的方法。
下面是Runnable接口和Thread类的局部方法声明:

Runnable接口:
public interface Runnable{
     public abstract void run();//描述线程操作的线程体
}

Thread类

Thread类:
public class Thread extends Object implements Runnable{
     public Thread();
     public Thread(String name);
     public Thread(Runnable target);
     public Thread(Runnable target, String name);//指定线程名及目标对象

     public abstract void run();//描述线程操作的线程体
     public final String getName();//返回线程名
     public final void setName(String name);
     public static int activeCount();//返回当前活动线程数目
     public static Thread currentThread();//返回当前执行的线程对象
     public String toString();
     public void start();//启动线程对象
}

使用上述两种类都可以构造线程,二者的主要区别:
1.继承Thread类。声明一个线程类继承Thread类并覆盖run()方法,,这种方法的有点是该线程类的对象就是线程对象,且具有线程体。缺点就是不适合多继承。
2.实现Runnable接口。声明一个线程类实现Runnable接口,该类创建的对象不是线程对象,它作为一个线程对象的目标对使用,所以还需要同时声明一个Thread类对象。

线程对象的优先级
java提供了10哥等级的线程优先级,分别用1-10表示,默认值为5。Thread类声明了一下3个表示优先级的公有静态常量:

  public static final int MIN_PRIORITY = 1    //最低优先级
  public static final int MAX_PRIORITY = 10   //最高优先级
  public static final int NROM_PRIORITY = 5   //默认优先级

可以通过以下方法获取和设置线程优先级:

  public final int getPriority()              //获得线程优先级
  public final void setPriority(int priority) //设置线程优先级

线程对象的生命周期
在java中,线程对象有以下6种状态
线程状态说明:
1.新建态。new Tread()创建的线程对象处于新建态NEW,系统没有为它分配资源。
2.运行态。从操作系统的角度看,处于新建态的线程启动后,进入就绪态,再由操作系统调度执行成为运行态。
3.阻塞态和等待态。一个运行态的线程因某种原因不能继续运行,进入阻塞态或等待态。处于阻塞态或等待态的线程不能执行,即使处理器空闲也不能执行。只有阻塞的原因消除,或等待条件满足,线程才能转为运行态。
4.终止态。线程对象停止运行未被撤销时是终止态。线程运行结束或者强制停止都可以使得线程进入终止态。
java线程对象的状态及状态变化:
在这里插入图片描述
以下是我写的关于多线程处理银行账户的一个例子。

 1package ThreadTest;
 2
 3public class Account {
 4
 5    public String name;
 6    public double balance;
 7
 8    public Account(String name) {
 9        super();
10        this.name = name;
11        this.balance = 0;
12    }
13
14    public  void desposit(double value) {
15        this.balance += value;
16    }
17
18    public  void withdraw(double value) {
19        this.balance -= value;
20    }
21
22    public static void main(String[] args) {
23        System.out.println("brooke");
24        Account brooke = new Account("brooke");
25        new DespositThread(brooke, 10000).start();
26        new DespositThread(brooke, 10000).start();
27        new WithdrawThread(brooke, 1000).start();
28    }
29}
30
31class DespositThread extends Thread{
32    private Account account;
33    private double value;
34
35    public DespositThread(Account account, double value) {
36        super();
37        this.account = account;
38        this.value = value;
39    }
40
41    @Override
42    public void run() {
43        synchronized(account) {
44            double Nowbalance = account.balance;
45            account.desposit(value);
46            try {
47                sleep(1);
48            } catch (InterruptedException e) {
49            }
50            System.out.println(account.name + "账户:现有"+Nowbalance+", 存入"
51                    +value+",余额为"+account.balance);
52        }
53    }
54}
55
56class WithdrawThread extends Thread{
57
58    private Account account;
59    private double value;
60
61    public WithdrawThread(Account account, double value) {
62        super();
63        this.account = account;
64        this.value = value;
65    }
66
67    @Override
68    public void run() {
69        synchronized(account) {
70            double Nowbalance = account.balance;
71            account.withdraw(value);;
72            try {
73                sleep(1);
74            } catch (InterruptedException e) {
75            }
76            System.out.println(account.name + "账户:现有"+Nowbalance+", 取出"
77                    +value+",余额为"+account.balance);
78        }
79    }
80}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Java面试题太多背不完的问题,以下是一些建议和解决方法: 1. 理解核心概念:首先,要确保对Java的核心概念有深入的理解,包括面向对象编程、多线程、异常处理、集合框架等。这些概念是Java面试中经常涉及的重要知识点。 2. 重点关注常见问题:了解常见的Java面试题,特别是那些经常被问到的问题。这些问题通常涉及Java的基础知识、常用类和库、设计模式等。可以通过查阅面试题集合、参考书籍或在线资源来获取这些问题。 3. 制定学习计划:根据自己的时间和能力,制定一个合理的学习计划。可以将面试题分为不同的主题,每天或每周专注于一个主题进行学习。这样可以有针对性地提高自己的知识水平。 4. 实践和编码:通过实践和编码来加深对Java知识的理解和记忆。可以尝试解决一些编程问题,参与开源项目或者自己动手实现一些小项目。这样可以将理论知识应用到实际中,加深记忆。 5. 参加模拟面试:参加模拟面试可以帮助你熟悉面试的流程和问题类型,并提供反馈和建议。可以找一些朋友或者加入面试准备的群组,进行模拟面试的练习。 6. 多做笔记和总结:在学习过程中,多做笔记和总结是很重要的。可以将重要的知识点、面试题和解答记录下来,方便日后复习和回顾。 总之,Java面试题太多背不完是一个常见的问题,但通过合理的学习方法和实践,可以提高自己的面试准备水平。记住,重要的是理解核心概念和掌握常见问题,而不是仅仅死记硬背。祝你面试顺利!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值