JavaSE基础(day20)(1)线程类的常用方法(2)线程的同步机制(3)网络编程的常识(4)基于tcp协议的编程模型

版权声明:cxyo.cn https://blog.csdn.net/weixin_44075537/article/details/85002178

默写:
1.编程题
分别使用两种方式启动一个线程,在该线程的run()方法中打印1 ~ 20之间的整数。

作业:
1.思考:创建和启动线程两种方式之间的区别?

  a.自定义类继承Thread类并重写run()方法,创建该类的实例去调用start()方法。
    b.自定义类实现Runnable接口并重写run()方法,创建该类的实例作为创建Thread类
      实例的实参然后再去调用start()方法。
 
当使用Runnable引用作为参数构造对象时(尽量理解):
    a.new Runnable接口的实现类对象传递给Thread类的构造方法。
    b.Thread类的构造方法将实现类对象传递给init()方法。
    c.init方法的内部将实现类对象传递给成员变量target。
    d.在run()方法中判断成员变量target是否为空,若不为空则调用run()方法。
      由于target引用指向实现类的对象,因此在运行阶段调用实现类中的run()方法。

解析:
a.继承的方式代码相对简单,但Java语言支持单继承,若继承Thread类则无法
继承其他父类.
b.实现接口的方式代码相对复杂,但不影响该类继承其他父类,并且支持多实现,
从项目的可维护性上来说,推荐使用该方式。

今天内容:
(1)线程类的常用方法
(2)线程的同步机制
(3)网络编程的常识
(4)基于tcp协议的编程模型

1.线程类的常用方法
static void yield() - 用于让出当前线程执行权,也就是暂停执行当前线程,
转而执行其他线程(了解)。
static void sleep(long millis) - 用于让当前线程休眠参数指定的毫秒数。
static void sleep(long millis, int nanos) -用于让当前线程休眠指定毫秒+纳秒
- 1秒=1000毫秒 1毫秒=1000微秒 1微秒 = 1000纳秒
void interrupt() - 中断线程,通常用于打断线程的休眠操作(了解)。
void setPriority(int newPriority) - 用于更改线程的优先级为参数指定的数值。
int getPriority() - 用于获取线程的优先级并返回。
- 优先级高的线程并不一定先执行,只是获取到时间片的机会更多一些。
void join() - 用于等待该线程终止。
void join(long millis) - 等待该线程终止的时间最长为参数指定的毫秒。
void join(long millis, int nanos)
- 等待该线程终止的最长时间为参数指定的毫秒 + 参数指定的纳秒。
void setDaemon(boolean on) - 用于将该线程设置为守护线程/用户线程。
- 守护线程用于守护其他线程,当其他线程都结束时,守护线程随之结束。

要求重点掌握的方法:
sleep()方法 和 join()方法。

2.线程的同步机制(重点)
复习:
StringBuffer类属于线程安全的类,支持线程的同步机制,执行效率低。
StringBuilder类属于非线程安全的类,不支持线程的同步机制,执行效率高。

2.1 基本概念
当多个线程同时访问同一种共享资源时可能会造成数据的不一致性,此时就需要进行线程之间的协调,而线程之间的协调和通信就叫做线程的同步机制。

2.2 解决方案
由程序案例可知:当多个线程同时访问账户余额时,会导致最终账户余额不正确。
导致的原因:其中一个线程还没有完成操作时,第二个线程就开始访问账户余额。
解决方案:将多个线程之间并行的操作改为串行的操作。
经验:上述方案会导致程序的执行效率变低,因此能不用则不用。

2.3 实现方式
在Java语言中使用synchronized关键字来实现同步锁机制,从而保证操作的原子性。
具体实现方式有两种:
a.使用同步语句块来实现同步锁机制,语法格式如下:

synchronized(锁对象的引用){
编写所有需要锁定的语句块;
}
b.使用synchronized关键字修饰方法,表示锁定整个方法的所有方法体。
等价于:

synchronized(this){
编写所有需要锁定的语句块;
}

2.4 死锁的发生
线程一执行的代码:
public void run(){

       synchronized(a){      持有对象锁a,等待对象锁b
          synchronized(b){
              ... ...
          }
       }
  }           

线程二执行的代码:

public void run(){
       synchronized(b){      持有对象锁b,等待对象锁a
          synchronized(a){
              ... ...
          }
       }
  }           

以后的开发中不要进行同步语句块的嵌套使用。

2.5 Object类的常用方法
void wait()
- 用于让当前线程进入等待状态,直到其他线程调用notify()/notifyAll()方法
void wait(long timeout)
- 用于让当前线程进入等待状态,直到调用上述方法或者参数指定的毫秒到了。
void wait(long timeout, int nanos)
- 用于让当前线程进入等待状态,直到参数指定的毫秒+纳秒到了,或者调用方法

void notify() - 用于唤醒等待的单个线程(随机)。
void notifyAll() - 用于唤醒等待的所有线程。

视频
javaseday20-作业讲解-01
https://v.qq.com/txp/iframe/player.html?vid=v0798gu669y
javaseday20-Thread类中的常用方法-02
https://v.qq.com/txp/iframe/player.html?vid=t0798ynmazu
javaseday20-同步锁机制-03
https://v.qq.com/txp/iframe/player.html?vid=z0798xx69qq
javaseday20-生产者和消费者模型-04
https://v.qq.com/txp/iframe/player.html?vid=m0798e2nfw9

代码
https://pan.baidu.com/s/1ecwhEd5QoOZpOrI6ztYSmQ

作业:
1.复习和理解线程同步机制。
2.参考并编写学生信息管理系统的案例。
3.有余力的同学自己编写生产者消费者模型的案例。

猜你喜欢

转载自blog.csdn.net/weixin_44075537/article/details/85002178
今日推荐