美文网首页
java多线程基础学习(二)

java多线程基础学习(二)

作者: ccq_inori | 来源:发表于2018-04-07 20:16 被阅读0次

上次学习到了如何停止线程。这次学习暂停线程,线程的优先级,什么是守护线程
首先了暂停线程
暂停的线程意味着此线程还可以恢复运行,在java多线程中,suspend()方法暂时线程,resume()恢复线程的执行

package learnThread;

public class myThread extends Thread {

    private long i=0;
    public long getI()
    {
        return i;
    }
    public void setI(long i)
    {
        this.i=i;
    }
    public void run() 
    {
        while(true)
        {
            i++;
        }
    }

    public static void main(String[] args) throws InterruptedException 
    {
        myThread thread=new myThread();
        thread.start();
        Thread.sleep(5000);
        thread.suspend();
        System.out.println("A="+System.currentTimeMillis()+" i="+thread.getI());
        Thread.sleep(5000);
        System.out.println("A="+System.currentTimeMillis()+" i="+thread.getI());
        
        thread.resume();
        Thread.sleep(5000);
        
        thread.suspend();
        System.out.println("B="+System.currentTimeMillis()+" i="+thread.getI());
        Thread.sleep(5000);
        System.out.println("B="+System.currentTimeMillis()+" i="+thread.getI());
    }

}
搜狗截图18年04月04日2210_1.png

但是suspend和resume方法使用不当的话,极其容易造成公共对象的独占,这会导致其他线程无法访问公共对象
还有一点,这两个方法极其容易因为线程的暂停而导致数据不同步。

package jianshu;

public class MyObject 
{
    private String username="1";
    private String password="11";
    public void setValue(String u,String p)
    {
        this.username=u;
        if(Thread.currentThread().getName().equals("a"))
        {
            System.out.println("停止a线程");
            Thread.currentThread().suspend();
        }
    }
    public void show()
    {
        System.out.println(username+" "+password);
    }
}
package jianshu;

public class Run {

    public static void main(String[] args) throws InterruptedException 
    {
        final MyObject myObject=new MyObject();
        Thread thread1=new Thread(){
            public void run()
            {
                myObject.setValue("a", "aa");
            }
        };
        thread1.setName("a");
        thread1.start();
        Thread.sleep(500);
        Thread thread2=new Thread() {
            public void run()
            {
                myObject.show();
            }
        };
        thread2.start();
    }

}
搜狗截图18年04月04日2226_2.png
线程的优先级

线程可以划分优先级,优先级较高的线程得到CPU资源较多,也就CPU优先执行优先级较高的线程
在java中,线程优先级可以分为1到10.也就是越大,优先级越高.如果小于1或者大于10则会抛出异常。

JDK中使用3个常量来预置定义优先级的值,代码如下

public final static int MIN_PRIORITY=1;
public final static int NORM_PRIORITY=5;
public final static int MAX_PRIORITY=10;
这里有个误区。不是说优先级高的线程就一定先执行完,之后才到优先级低的线程。优先级高的线程只是CPU尽量将执行资源让给优先级比较高的线程。
package jianshu;

import java.util.Random;

public class MyThread1 extends Thread 
{
    public void run()
    {
        long beginTime=System.currentTimeMillis();
        long addResult=0;
        for(int j=0;j<10;j++)
        {
            for(int i=0;i<10000;i++)
            {
                Random random=new Random();
                random.nextInt();
                addResult++;
            }
        }
        long endtime=System.currentTimeMillis();
        System.out.println("thread 1 use time="+(endtime-beginTime));
    }
}
package jianshu;

import java.util.Random;

public class MyThread2 extends Thread 
{
    public void run()
    {
        long beginTime=System.currentTimeMillis();
        long addResult=0;
        for(int j=0;j<10;j++)
        {
            for(int i=0;i<10000;i++)
            {
                Random random=new Random();
                random.nextInt();
                addResult++;
            }
        }
        long endtime=System.currentTimeMillis();
        System.out.println("thread 2 use time="+(endtime-beginTime));
    }
}
package jianshu;

public class Run1 {

    public static void main(String[] args)
    {
        for(int i=0;i<5;i++)
        {
            MyThread1 thread1=new MyThread1();
            thread1.setPriority(10);
            thread1.start();
            MyThread2 thread2=new MyThread2();
            thread2.setPriority(1);
            thread2.start();
        }
    }

}
搜狗截图18年04月05日2050_1.png

守护线程

java线程中有两种线程,一种是用户线程,另一种是守护线程
守护线程是一种特殊的线程。当线程中不存在非守护线程了,则守护线程自动销毁。
用我自己的话来讲就是,如果一个线程是守护线程,那么它必须等到其他非守护线程全部结束运行后,守护线程才能结束运行。守护线程最典型的应用就是GC(垃圾回收器)。

相关文章

  • Java多线程学习(三)——synchronized(上)

    在前两节的《Java多线程学习(一)——多线程基础》和《Java多线程学习(二)——Thread类的方法介绍》中我...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 大数据学习路线

    一、linux基础(基本掌握) 二、java多线程、并发包下的队列、JMS、JVM、反射和动态代理 学习参...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • java多线程基础学习(二)

    上次学习到了如何停止线程。这次学习暂停线程,线程的优先级,什么是守护线程首先了暂停线程暂停的线程意味着此线程还可以...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • 为什么ArrayList线程不安全

    在学习java基础多线程时,我们学习过synchronize,synchronized同步块使用了monitor...

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • Java多线程:生命周期,实现与调度

    前面几篇文章为Java多线程做足了铺垫,这篇终于到了正题,一起学习一下Java多线程的基础知识。 1. Java线...

网友评论

      本文标题:java多线程基础学习(二)

      本文链接:https://www.haomeiwen.com/subject/qrzscftx.html