java学习:线程

1.进程和线程 

  1. 进程是一个应用程序(一个进程是一个软件)
  2. 线程是一个进程中的执行场景/执行单元
  3. 一个进程可以启动多个线程
  4. 进程可以看作是现实生活当中的公司
  5. 线程可以看作是公司当中的某个员工
  6. 进程A和进程B的内存独立不共享
  7. 线程A和线程B,堆内存和方法区内存共享,但是栈内存独立,一个线程一个栈
  8. 假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发
  9. 多线程并发可以提高效率
  10. java中之所以有多线程机制,目的就是为了提高程序的处理效率
  11. 使用了多线程机制之后,main方法结束,只代表主线程结束了,其他线程可能还在执行

2.多线程并发

  1. 对于多核的cpu电脑来说,真正的多线程并发没有问题
    1. 4核cpu表示同一个时间点上,可以真正的有4个线程并发执行
  2. 什么是多线程并发
    1. t1线程执行t1的,t2线程执行t2的,t1不会影响t2,t2也不会影响t1,这叫做真正的多线程并发
  3. 单核cpu表示只有一个大脑
    1. 不能做到真正的多线程并发,但是可以做到给人一种多线程并发的感觉

3.java语言中实现线程有两种方式

  1. java支持多线程机制,并且java已经将多线程实现了,我们只需要继承就可以了
  2. 编写一个类,直接继承java.lang.Thread,重写run方法
    1. public class ThreadTest{
          public static void main(String[] args){
              //新建分支对象
              MyThread myTread = new Mythread();
              //启动线程
              myThread.start();
              //代码还是运行在主线程中
              for(int i = 0; i < 1000; i++){
                  System.out.println("主线程-->" + i );
              }
          }
      }
      class Mythread extends Thread{
          public void run(){
              for(int i = 0; i < 1000; i++){
                  System.out.println("分支线程--->" + i);
              }
          }
      }
    2. void start()
      1. 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
      2. 结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。
      3. 多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
      4. 启动一个分支线程,在jvm中开辟一个新的栈空间,这段代码任务完成以后,瞬间就结束了,这段代码的任务只是为了开辟一个新的栈空间,只要新的栈空间开辟出来,start()方法就结束了。线程就启动成功了
      5. 启动线程会自动调用run方法,并且run()方法在分支的栈底部(压栈)。
      6. run方法在分支栈的栈底部,main方法在主栈的栈底部,run和main是平级的
    3. void run()
      1. 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

        Thread 的子类应该重写该方法。

  3. 编写一个类,实现java.lang.Runnable接口,实现run方法

    1. public class TreadTest01{
          public static void main(String[] args){
              MyRunnable() r = new MyRunnable();
              Tread t = new Tread(r);
              t.start();
              for(int i = 0; i < 100; i++){
                  System.out.println("主线程-->" + i);
              }
          }
      }
      
      class MyRunnable implements Runnable{
          public void run(){
              for(int i = 0; i < 100; i++){
                  System.out.println("分支线程-->" + i);
              }
          }
      }
  4. 第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承其他的类,更灵活

4.线程声明周期

  1. 就绪状态的线程又叫做可运行状态,表现hi当前线程酷游抢夺cpu时间片的权利(cpu时间片就是执行权)。当一个线程抢到cpu时间片之后,就开始执行run方法,run方法的开始执行标志着线程进入运行状态
  2. run方法的开始执行标志着这个程序进入运行状态,当之前占有的cpu时间片用完之后,会重新回到就绪状态继续抢夺cpu时间片,当再次抢到cpu时间之后,会重新进入run方法,接着上一次的代码继续往下执行
  3. 当一个线程遇到阻塞事件,例如接收用户键盘输入,或者sleep方法等,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的时间片
  4. 之前的时间片没了,需要再次回到就绪状态,抢夺cpu时间片
  5. 新建状态
  6. 就绪状态
  7. 运行状态
  8. 阻塞状态
  9. 死亡状态

5.获取线程的名字

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值