《Java多线程编程核心技术》学习笔记(1)

Java多线程 专栏收录该内容
3 篇文章 0 订阅

一、实现多线程的编程方式

(1)继承Thread类

public class MyThread extends Thread {
   @Override
   public void run() {
      super.run();
      System.out.println("MyThread");
   }
}
public class Run {

   public static void main(String[] args) {
      MyThread mythread = new MyThread();
      mythread.start();
      System.out.println("运行结束!");
   }

}

(2)实现Runnable接口

public class MyRunnable implements Runnable {
   @Override
   public void run() {
      System.out.println("运行中!");
   }
}
public class Run {

   public static void main(String[] args) {
      Runnable runnable=new MyRunnable();
      Thread thread=new Thread(runnable);
      thread.start();
      System.out.println("运行结束!");
   }

}

二、实例变量与线程安全

i - - 的操作分为3步:

  • 取得原有i值。
  • 计算i-1。
  • 对i进行赋值。

如果有多个线程同时访问,那么会存在非线程安全的问题。这个时候可以用到关键字:synchronized

public class MyThread extends Thread {

   private int count=5;
   
   @Override
   synchronized public void run() {
      super.run();
         count--;
         System.out.println("由 "+this.currentThread().getName()+" 计算,count="+count);
   }
}
public class Run {
   public static void main(String[] args) {
      MyThread mythread=new MyThread();

      Thread a=new Thread(mythread,"A");
      Thread b=new Thread(mythread,"B");
      Thread c=new Thread(mythread,"C");
      Thread d=new Thread(mythread,"D");
      Thread e=new Thread(mythread,"E");
      a.start();
      b.start();
      c.start();
      d.start();
      e.start();
   }
}

三、currentThread()方法

用于返回代码段正在被哪个线程调用的信息。

public class MyThread extends Thread {

   public MyThread() {
       System.out.println("构造方法的打印:" 
+ Thread.currentThread().getName());
   }

   @Override
   public void run() {
       System.out.println("run方法的打印:" 
+ Thread.currentThread().getName());
   }

}

public class Run1 {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
    }
}
public class Run2 {
    public static void main(String[] args) {
        MyThread mythread = new MyThread();
        // mythread.start();
        mythread.run();
    }
}

运行结果:

Run2Run2
构造方法的打印:mainmain
run方法的打印:Thread-0main

四、isAlive()方法

判断当前线程是否处于活动状态

五、sleep()方法

方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个正在执行的线程是指this.currentThread()返回的线程。

六、getId()方法

取得线程的唯一标识。

七、停止线程

1)停止不了的线程 - interrupt()

调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真正的停止了线程。

2)判断线程是否停止状态

this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能。
this.isInterrupted():测试线程Tread对象是否已经是中断状态,但不清除状态标志。

3)能停止的线程——异常法

在线程中用for语句来判断一下线程是否是停止状态,如果是停止状态,则后面的代码不再运行即可。
关键代码:for循环中break。

4)在沉睡中停止

sleep()

5)能停止的线程——暴力停止

stop()

6)能停止的线程——return

八、暂停线程

暂停线程意味着此线程还可以恢复运行。在java多线程中,可以使用suspend() 方法暂停线程,使用resume() 方法恢复线程的执行。

1)suspendresume的缺点——独占

2)suspendresume的缺点——不同步

九、yield方法

yield()是放弃当前的cpu资源,将它让给其他任务去占用cpu执行时间。但是放弃的时间不确定,有可能刚刚放弃,就又获得了cpu时间片。

十、线程的优先级

setPriority()方法可以设置线程的优先级。

1)线程的优先级具有继承性

2)线程的优先级具有规则性

cpu尽量将执行资源让给优先级比较高的线程,但不代表高优先级的线程全部先执行完。

3)线程的优先级高的运行的快

十一、守护线程

守护线程的作用是为其他线程的运行提供便利的服务,最典型的是GC(垃圾回收器)。

public class MyThread extends Thread {
   private int i = 0;

   @Override
   public void run() {
      try {
         while (true) {
            i++;
            System.out.println("i=" + (i));
            Thread.sleep(1000);
         }
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
}
public class Run {
   public static void main(String[] args) {
      try {
         MyThread thread = new MyThread();
         thread.setDaemon(true);
         thread.start();
         Thread.sleep(5000);
         System.out.println("我离开thread对象也不再打印了,也就是停止了!");
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页

打赏作者

第七人格

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值