JAVA-基础(线程)

Posted fan123yh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-基础(线程)相关的知识,希望对你有一定的参考价值。

1.什么叫并发?

多个线程在同一时间段运行(交替运行)。

2.什么叫并行?

是指多个处理器(cpu),多个线程在同一时刻运行。

3.什么叫进程?

一个个的软件就是一个进程。

4.什么叫线程?

在进程中,有多线程在同时工作。

5.java线程的原理?

一但创建一个线程,首先会发送一个通道到cpu,线程来抢占cpu的执行权。

6.java实现线程?

(1).继承Tread类

 1.重写run方法.
 2.创建类.
 3.start().

(2).实现runable接口

 1.重写run方法.
 2.创建类。
 3.Thread th =new Thread(类);
 4.start().

7.java线程哪个比较好?

实现runable比较好,原因:继承属于单继承,实现可以多实现。

8.java线程常用方法?

run   线程方法配置,线程运行.

start 线程启动。

sleep 线程睡眠。

9.多线程安全问题的产生原因?

当我们用到共享资源的时候,就会出现多线程安全问题。

10.解决多线程安全问题?

 (1).使用同步代码块  

  synchronized(任意的对象(锁) )
  
    写要被同步的代码
  

  所谓的锁,是指一个对象,即多个线程共用的对象。

解释:当一个线程抢占到锁的时候,别的线程如果要运行这一段代码,就要先阻塞,等待锁对象释放。

 (2).同步方法

  public synchronizd void pay()

     .......

     

把访问了的共享数据代码抽取出来放到一个方法中,在方法上添加synchronizd修饰符。同步方法的锁对象就是实现类对象。

注意事项:

在同步方法上加static修饰符就是静态同步方法。
静态同步方法锁对象就是本类的calss属性也叫calss文件对象(反射)。

 (3).lock锁

  lock锁比synchronizd使用更加方便。 lock是一个接口,是主要常用的方法主要有lock(获取锁)和unlock(释放锁对象)。lock的实现类主要有Reentrantlock。

  使用步骤:

   1.在成员位置创建一个向上转型的lock对象。

   2.在共享代码之前,调用lock方法获取锁对象。

  3.在共享代码之前,调用unlock方法释放锁对象。

  注意事项:注意如果出现共享代码异常,用finally最后释放锁对象,否则容易出现死锁。

11.线程各个状态?

新建状态,阻塞状态,运行状态,死亡状态,睡眠状态,无限等待状态。

新建状态:就是在新建线程的时候。

阻塞状态:就是具备cup执行资格,等待cup空闲时执行。与其他线程进行抢占。

运行状态:当前线程运行。

睡眠状态:放弃执行cup的资格,就算优先级比较高也不执行,直至睡眠时间结束。

无限状态:wait()方法,使线程进入睡眠状态。但是没有设置时间,所以除非等到调用notify方法才可以结束当前状态。

死亡状态:run方法结束或者调用stop方法。

新建状态--->阻塞状态 优先级比较低,所以就会进入阻塞状态。
新建状态--->运行状态 优先级比较高,所以抢占到cpu的运行权力。
运行状态--->阻塞状态 优先级比较高,所以抢占到cpu的运行权力。
运行状态--->睡眠状态 调用sleep wait(long)方法,使线程进入睡眠状态。
运行状态--->无限状态 调用 wait()方法,使线程进入睡眠状态。
运行状态--->死亡状态 run方法结束或者调用stop方法。

12.java线程通信

(1).目的?

  解决多个线程并发运行,提高cup利用,让多个线程进行协调。

(2)原理?

  主要用到的方法有就是wait与notify唤醒机制。

(3)wait与notify?

  wait方法如果不加参数,线程就会进入无限等待状态,直至调用notify方法。

  notify是object对象的方法,要求wait与notify必须是同一个锁对象,同时java多线程通信需要用到同步技术,而实现lock接口不行, 因为他们需要同一锁对象(对象监听器)。 如果锁对象不一样,notify只会唤醒该对象持有的线程。

  wait方法满足队列的方式,最先睡着的线程,最先唤醒。

  如果线程从无限等待状态被唤醒,不会立即进入运行状态,会首先判断cup是否空闲。

13.线程池?

  (1).原理?

  所谓的线程池其实就是一个容器:也就是集合(ArrayList(),hashSet(),linkList<Thread>,HashMap)线程池就用到了linkList<Thread>。他是一个队列,也就是满足先进后出的原则。当我们程序第一次运行时,会创建多个线程,保存到一个集合中。当我们使用完后,就会归还线程池。

  (2).使用优点?

   1.降低资源消耗。

   2.提高响应速度。

   3.提高线程可管理性。

  (3).注意事项?

   java中线程池的顶级接口是java.util.concurrent.Executor,他是一个执行线程的工具,真正的线程池接口是java.util.concurrent.ExecutorService 。

  static ExecutorService newFixedThreadPool(int nthread)创建一个可重用的固定线程数的线程池,从线程池中获取线程,调用start方法。submit(Runable task) 提交一个Runable任务用于执行。

  关闭销毁线程池的方法 void shutdown()。

  (4)调用线程的步骤?

  1.使用线程池工厂类Executor里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池。

  2.创建一个类实现runable接口,重写run方法,设置线程任务。

  3.调用ExecutorService submit方法传递实现类(即重写的接口实现类),开启线程,执行run方法。

  4.掉用shutdown方法,销毁线程,(不建议执行)。

 

以上是关于JAVA-基础(线程)的主要内容,如果未能解决你的问题,请参考以下文章

Java基础教程:多线程基础——线程的状态

Java 线程基础

分享一个java线程专栏

Java并发知识整理

java 基础学习:多线程04

Java多线程基础