进程和线程



【进程】:正在执行的程序都可以看做是一个进程,该进程负责向系统申请内存
【线程】:在一个进程中,负责了某一个功能的运行

【问题】:
 Windows操作系统是号称多任务的操作系统,那么Windows是怎么执行多个应用程序的???

 从宏观角度:Windows的确可以同时执行多个应用程序
 从微观角度:CPU做了一个快速切换的操作,在单位时间片内不停的切换不同的应用程序,但是每一个时间片内
 有且只能执行一个程序,但是速度很块,是体会不到切换的操作的。

【注意】运行任何一个Java程序,【至少】有两个线程,一个是main函数线程,一个是JVM的垃圾回收机制

【多线程的好处:】
 1. 可以让一个进程同时执行多个功能
 2. 提供了资源的利用率

【多线程的弊端:】
 1. 线程安全问题
 2. 增加了CPU的负担
 3. 降低了一个线程执行的几率
 4. 容易出现死锁现象

【如何创建多线程:】
 
 方式1:
  1. 自定义一个类继承Thread类
  2. 重写Thread当中的run方法,把要自定义线程的任务代码写在run方法里面

      重写run方法的目的是什么?
   每一个线程都有自己的任务代码,JVM创建的main线程的任务代码在main中,其他的线程(包括自定义线程)
   都是把任务代码写在run方法中,自定义线程负责在run方法中执行
  
  3. 创建Thread的子类的对象,要使用线程的话,需要用start开启

   public class TestThread01 extends Thread{
 @Override
 public void run() {
  for(int i=0;i<100;i++){
   System.out.println("自定义一个线程,跑了"+i);
  }
 }
 public static void main(String[] args) {
  TestThread01 tt=new TestThread01();
  tt.start();//使用自定义线程,要用start来启动它
  
  for(int i=0;i<100;i++){
   System.out.println("main线程,跑了"+i);
  }
 }
}

*****************************************************************************************

方式二:
  1. 自定义一个类【遵从】Runnable接口
  2. 实现Runnable接口中要求实现的Run方法,把线程任务代码写在run方法
  3. 创建Thread类对象,并且把【遵从】Runnable的子类对象,作为构造函数的参数
  4. 调用Thread类对象的start方法,开启线程
 
 【问题:】
   【遵从】Runnable类对象是一个线程对象吗?
  
   【遵从】Runnable的类对象不是一个线程对象,只不过实现了Runnable中要求实现run方法,
    这方法可以提供给Thread 作为线程的任务代码
  
    只有继承于Thread的子类对象或者Thread类对象才是一个线程对象

  class Test implements Runnable{
 public void run() {
        System.out.println(Thread.currentThread().getName()+"fff");  
 }
}
public class TestRunnable {
 public static void main(String[] args) {
  /*Test t=new Test();
  t.start();*///这种启动线程的方法是错误的
  //Runnable接口里面没有start方法,它只能通过遵从它的Thread类里面的start方法来启动
  
  Test test=new Test();
  Thread thread=new Thread(test,"线程1");//线程1是创建的一个线程对象
  thread.start();
 }

**************************************************************************************************

Java当中线程同步机制的方式:
  【方式1:】
 同步代码块
 格式:
  synchronized (锁对象) {
   需要同步的代码~~~
  }

同步代码块注意的事项:
1. 任意的一个对象都可以是一个锁对象
2. 要求锁对象必须是同一个对象【重点】
3. sleep不会释放锁对象,打开锁
4. 只有真正的出现了线程安全问题的时候,才可以使用synchronized 同步代码块~

【方式2:】
 同步函数

线程安全的本质原因:
1. 存在两个或两个以上的线程,而且线程直接存在【共享】资源
2. 多个语句操作共享资源

************************************************************************************************

Java中的同步机制,解决线程安全问题,也导致了存在死锁情况

死锁现象出现,根本原因
 1.存在两个或两个以上的共享资源
 2.存在两个或两个以上的线程,要使用这些资源

*********************************************************************************************

生产者和消费者的问题

wait() 等待 如果一个线程执行了wait方法, 那么这线程会进入临时阻塞状态,等待唤醒,这个必须由其他线程
调用notify()唤醒

notify() 唤醒  唤醒线程池等待的线程中其中一个

wait和Notify注意事项:
 1. wait和notify是Object类的方法 【思考】
 2. 调用wait和notify方法只能是锁对象来调用
 3. wait和notify方法必须是同步代码块或者同步函数中使用

************************************************************************************************

当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;
如果还有一个或以上的非守护线程则JVM不会退出
1、thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个异常。你不能把正在运行

的常规线程设置为守护线程。

2、在守护线程中产生的线程也是守护线程.

3、我们自己产生的守护线程应该避免访问一些类似于文件、数据库等固有资源,因为由于JVM没有用户

线程之后,守护线程会马上终止。

************************************************************************************************

join方法, 加入
一个线程如果执行join语句,会立即夺取CPU的执行权,立即执行。其他的线程都会停止
其他的线程直到当前join的线程执行完毕才开始执行





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值