Java多线程编程一(一些线程的知识)


感谢java多线程核心编程一书,为本系列文章提供参考借鉴

一、进程和线程的概念及线程的优点
  1. 进程:可简单理解为window上的一个应用程序如:qq.exe。
  2. 线程:可简单理解为qq.exe中的一个后台下载程序等。
    线程的优点:在同一时间可以同时进行多个任务的工作,很方便,高效率的节省工作时间。如你在聊q的同时,听歌,下载文件,聊天。。。
二、使用多线程
  1. 继承Thread类重写run()方法:
public class MyThread extends Thread{
    @Override
    public void run() {
        super.run();
        System.out.println("需要执行的任务");
    }
    public static void main(String[] args)  {
        Thread thread = new MyThread();
        thread.start();
        System.out.println("运行结束!");
   }
}
  1. 实现Runnable接口:
public class MyThread implements Runnable{
    public void run() {
        System.out.println("需要执行的任务");
    }
    
	public static void main(String[] args)  {
        Thread thread = new Thread(new MyThread());
        thread.start();
        System.out.println("运行结束!");
    }
}
三、实例变量和线程安全

自定义的线程类中实例变量针对其他线程可以有共享和不共享之分,这在多个线程之间进行交互时是个重要的技术点。

  1. 不共享数据的情况下:如下
public class MyThread extends Thread {

    private int count = 5;

    public MyThread(String name) {
        this.setName(name);
    }

    @Override
    public void run() {

        System.out.println("需要执行的任务");
        while (count > 0) {
            count--;
            System.out.println("由:" + Thread.currentThread().getName() + "计算,count=" + count);
        }

    }
    
	public static void main(String[] args)  {
	        MyThread a = new MyThread("A");
	        MyThread b = new MyThread("B");
	        MyThread c = new MyThread("C");
	        a.start();
	        b.start();
	        c.start();
	        System.out.println("运行结束!");
	    }
}

由于每个实例都有属于自己的变量count,计算互不干扰,既不共享数据,所有也就不会出现错误数据的情况,是线程安全的。

  1. 共享数据的情况下:
public class MyThread extends Thread {
    private int count = 5;
    @Override
    public void run() {
        System.out.println("需要执行的任务");
        while (count > 0) {
            count--;
            System.out.println("由:" + Thread.currentThread().getName() + "计算,count=" + count);
        }
    }
    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");
        a.start();
        b.start();
        c.start();
        System.out.println("运行结束!");
    }
}
运行结果:![在这里插入图片描述](https://img-blog.csdnimg.cn/20190218150008718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMjI1Mzk5,size_16,color_FFFFFF,t_70)
右图中结果我们发现,出现了线程A和线程B取出的值为同一个值,产生了非线程安全的问题。
在jvm中,i--分为如下三步:
 1. 取得原有值i
 2. 计算i-1
 3. 对i进行赋值
在这三个步骤中,如果有多个线程同时访问,那么一定会出现非线程安全问题。
这里暂不纤细叙述,后续会专门讲到这个问题及解决办法。
四、部分常用方法
  1. currentThread()
    返回代码正在被哪个线程调用的信息。
  2. isAlive()方法,判断当前线程是否处于活动状态,活动状态就是线程已经启动且尚未终止,线程处于正在运行或准备开始运行的状态就认为是“存活"的。
  3. sleep()方法:指定毫秒数内,让‘当前’正在执行的线程休眠(暂停执行)
  4. getId()方法:获得线程的唯一标识。
五、停止线程:
  1. interrupt():仅仅是在当前线程打了一个中断的标记,并不是真正的停止线程。
    判断线程是否停止状态:
		this.interrupt();//测试当前线程是否已经中断,线程的中断状态由该方法清楚,当前线程是指运行this.interrupt()方法的线程
        this.isInterrupted();//测试线程是否已经中断

在这里插入图片描述
2. 异常法(抛出异常来终止线程的运行)
3. 如果沉睡中停止线程,会发生异常
4. 暴力停止stop() 废弃
5. return停止线程

六、线程的优先级:

在操作系统中,线程可以划分优先级,优先级较高的线程得到cpu的资源较多,也就是cpu优先执行优先级较高的线程对象中的任务。
设置线程的优先级有助于帮“线程规划器“确定在下一次选择哪一个线程来优先执行。
设置线程的优先级使用setPriority()方法。
JDK使用3个常量来预置定义优先级的值,代码如下:

   /**
     * The minimum priority that a thread can have.
     */
    public final static int MIN_PRIORITY = 1;

   /**
     * The default priority that is assigned to a thread.
     */
    public final static int NORM_PRIORITY = 5;

    /**
     * The maximum priority that a thread can have.
     */
    public final static int MAX_PRIORITY = 10;
  1. 线程的优先级具有继承性:
    线程A启动线程B,A与B具有相同的优先级。

  2. 优先级具有规则性:大部分高优先级的线程比低优先级线程先执行完,并不是一定就会比低优先级的先执行完。

七、守护线程

守护线程是一种特殊的线程,他的特性有“陪伴”的含义,当进程不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,那么垃圾回收线程也就没有存在的必要了,自动销毁。
“守护线程“:任何一个守护线程都是整个JVM中所有非守护线程的“保姆”,只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才会随着jvm一同结束工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值