线程相关——《java网络编程》

线程相关

1. 产生线程:

  •      继承Thread并重写public void run()。在try块中初始化文件流。main方法中利用多态新建一个Thread类变量,并调用.start开始运行。但重写run()方法无法向程序的其他部分传递信息。
  •      也可以不继承Thread类,而是实现Runnable接口,并重写run方法。在main方法中新建该类,并将其传给Thread类的构造函数。


     不同的线程会占用不同的系统cpu和磁盘速度等,它们在资源分配中产生竞争关系,而你无法控制这一点。这些被称为竞态条件。它们会导致线程可能不在你期望的时间运行结束。为了解决竞态条件的问题,人们有两种选择,轮询和回调。轮询就是让主函数不停询问线程,直到得到结果,但这并不是一个好办法,它会占用主函数里其他语句的运行时间。回调就是让线程告诉主函数它在什么时候运行结束。可以通过静态方法回调,也可以通过实例方法回调。实例方法回调时,线程类需要在它内部有一个对回调对象的引用。

2. 同步线程:
 同步可以指定一部分程序只能由一个线程调用,避免了线程之间争抢资源。有两种方法可以进行同步:

  •  可以使用同步块进行同步。Synchronized(System.out){}。小括号里的是要同步的对象。
  •  java提供了一个同步方法。在方法之前声明synchronized可以对整个方法进行同步。

 同步可以解决线程安全问题,但是它并不总是最好的解决办法,还有一些其他的方法可以做到线程安全。

  • 每个线程使用自己的局部变量。
  • 利用类中某些变量的不可变性,将其声明为private和final。
  • 将非线程安全的类作为线程安全类的一个私有字段,只以线程安全的方法访问这个类。


3. 线程死锁:
 两个线程都抢占了一部分同步的资源,但都不愿意放弃已有的资源,就会发生死锁。

4. 线程调度:
 线程有自己的优先级,通过setPriority来设置。
 线程有两种调度方式,抢占式和协作式。抢占式会在轮到其他cpu时间时暂停当前线程,把cpu控制权交给其他线程。协作式则会等待当前线程运行完毕,再移交控制权。

 一个线程有很多种方式可以进行被暂停,以让其他线程有机会运行。阻塞、放弃、休眠等等等等,等到需要用到的时候再来一一探究。

猜你喜欢

转载自www.cnblogs.com/chanonnn/p/12950283.html