java高级之多线程知识

1.程序,进程,线程

  程序:一组能完成一定任务的文件,是静止的

  进程:程序运行之后至少会启动一个进程,是一个动态变化的

            一个程序可以启动多个进程

           多进程会消耗更多的系统资源

           每一个进程都独占一块内存,进程之间通信开销大

     

线程:线程是进程内部的运行单元

          一个进程可以包含多个线程,至少包含一个线程

         每一个线程有独立的内存空间,多个线程之间可以通过进程的内存进行通信  


2.如何实现多线程编程

   a.通继承Thread实现多线程

   b.实现Runnable接口

   c.通过定时器创建线程:TimerTask  定时任务

   d.Callable

  


3.Thread和Runnable的区别

Thread对象是一个线程对象,可以直接并行运行

Runnable对象只是一个可并行的任务,不能够直接并行运行,需要将其包装成Thread对象

4.线程的常用方法

Thread th = Thread.currentThread(); 获得当前线程对象

String name = th.getName();  获得线程的名字

String id = th.getID(); 获得线程的标识符

5.问题:

  a.多个线程共用同一个变量,为什么用基本类型不可以通过构造方法传递?

  b.为什么会出现不同的结果?


  

6.线程的几种状态、线程的生命周期

 New Thread 新建状态  :创建了线程对象,调用start之前

  Runnable   就绪状态[可运行状态]  调用了start之后,run方法执行之前

  Running    运行状态                          run方法正在执行

  Not Run    阻塞状态[挂起]   线程sleep,wait的时候

  Dead       死亡状态                      run正常结束或者进程终止

作业:

1.完成以上1到6点的总结

    文字描述+代码示例/画图说明

2.使用多线程完成一个文件的复制

====================================================

7.线程池

线程池的四种创建方式及用法:

//创建一个存放单一线程的线程池

//ExecutorService service = Executors.newSingleThreadExecutor();



//创建固定线程数量的线程池

//ExecutorService service = Executors.newFixedThreadPool(2);



//创建一个可缓存线程对象的线程池

//ExecutorService service = Executors.newCachedThreadPool();



//创建一个可延时执行的线程池,

ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

测试代码:

MyRunnable mr = new MyRunnable();



// service.execute(mr);

// service.execute(mr);

service.execute(mr);

service.schedule(mr, 2, TimeUnit.SECONDS);

--------------------------------

任务:

1.修改完成多线程文件复制

2.完成今天的知识点总结

===================================================================

8.线程的常用方法

 //设置和获得线程优先级的方法

 //线程的优先级从1到10,默认值是5 

  

 setPriority(int newPriority);

  getPriority();

  //线程休眠的方法

  sleep(long millis);

  //等待该线程先执行完毕

  join();

  

  //暂停当前正在执行的线程,去执行其他线程

  yield();

  

   //中断线程,中断线程会抛出线程中断的异常

  

 interrupt();

   

   //设置守护线程

   setDaemon(true);

  ----------------------------------------------------------------------------

9.线程的同步

  线程的执行默认是异步的:

  多个线程可以同时访问同一个数据[同一块内存]

  同步:在同一个时间只能有一个线程访问这个数据

 如何实现线程同步:

1.使用同步代码块

synchronized(对象){

需要同步的代码

}

2.使用同步方法 

 public synchronized void method(){

  

  }

3.使用同步锁

  Lock lo = new ReentrantLock();

  lo.lock();//上锁

  lo.unlock(); //解锁

4.使用本地变量

  使用ThreadLocal存放变量

-------------------------------------------------------

作业:

1.总结:

    线程常用方法有哪些?用途是什么

    线程的优先级

    什么是守护线程,如何实现守护线程,有什么意义?

    什么是线程同步?如何实现线程同步?  

2.线程同步的案例   

3.线程的通信

---------------------------------------------------------

 10.  生产消费者模型

      wait notify机制

      wait()

      notify()

      notidyAll()

wait和sleep的区别: 

wait和sleep都是让当前线程进入阻塞状态

 wait方法是Object类中的方法

 sleep是Thread类的方法



 当线程在wait的时候,会释放线程占用的资源

线程sleep的时候,会继续占用资源

 notify与notifyAll的区别:

 notify随机唤醒在同一个对象上wait的线程

 notifyAll唤醒所有在这个对象上wait的线程

 -----------------------------------------------

扩展: 

使用阻塞队列实现生产消费模型

 LinkedBlockingQueue

发布了52 篇原创文章 · 获赞 38 · 访问量 2504

猜你喜欢

转载自blog.csdn.net/weixin_44364444/article/details/104020038