龙空技术网

Java线程详解(附实例)

知了堂 352

前言:

现在各位老铁们对“java线程详解”大约比较着重,小伙伴们都想要分析一些“java线程详解”的相关内容。那么小编在网络上搜集了一些对于“java线程详解””的相关文章,希望看官们能喜欢,小伙伴们快快来学习一下吧!

1、线程的状态

package com.cjg.xiancheng;public class threadStop implements Runnable   {    //如果不填 boolean的默认值为flase    private  boolean flag=true;    @Override    public void run() {        int i =1;       while (flag){           System.out.println("****"+i++);       }    }    public void stop(){        this.flag=false;    }    public static void main(String[] args) {        threadStop threadStop = new threadStop();        new Thread(threadStop,"me").start();        for (int i = 0; i < 1000; i++) {            System.out.println("main"+i);            if (i==500){                threadStop.stop();                System.out.println("stop=============================================================================");            }        }    }}

package com.cjg.xiancheng;import java.text.SimpleDateFormat;import java.util.Date;public class threadTime {    public static void main(String[] args) throws InterruptedException {        f();        while (true){            //打印当前系统的时间            Date date = new Date(System.currentTimeMillis());            Thread.sleep(1000);            System.out.println(new SimpleDateFormat("yyyy--MM--dd HH:mm:ss").format(date));        }    }    public static void f() throws InterruptedException {        int i=10;        while (true){            Thread.sleep(100);            System.out.println(i--);            if (i==0)break;        }    }}

2、线程的礼让

package com.cjg.xiancheng;public class threadYield {    public static void main(String[] args) {        didi didi = new didi();        new Thread(didi,"一号弟弟").start(); new Thread(didi,"二号弟弟").start();    }}class didi implements Runnable{    @Override    public void run() {        System.out.println(Thread.currentThread().getName()+"start");        Thread.yield();        System.out.println(Thread.currentThread().getName()+"end");    }}

Join

◆Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞。

package com.cjg.xiancheng;public class threadJoin implements  Runnable {    @Override    public void run() {        for (int i = 0; i < 1000; i++) {            System.out.println(Thread.currentThread().getName()+i);        }    }    public static void main(String[] args) throws InterruptedException {        threadJoin threadJoin = new threadJoin();        Thread thread = new Thread(threadJoin, "vip");                thread.start(); //线程已经开始        for (int i = 0; i < 500; i++) {            System.out.println(Thread.currentThread().getName()+i);            if (i==100){                //知道join线程结束都只执行join线程                thread.join();            }        }    }}
3、线程的状态的查看
package com.cjg.xiancheng;public class threadStatus {    public static void main(String[] args) throws InterruptedException {        Thread thread =new Thread(()->{            for (int i = 0; i <5 ; i++) {                try {                    Thread.sleep(1000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println("============================================================================");        });        Thread.State state = thread.getState();        System.out.println(state);        thread.start();        while (state !=Thread.State.TERMINATED){            Thread.sleep(100);          state = thread.getState();            System.out.println(state);        }    }}

4、线程的优先级

优先级低只是意味着获得调度的概率低。并不是优先级低就不会被调用了。这都是看CPU的调度。

可能会造成性能倒置

package com.cjg.xiancheng;public class threadMore {    public static void main(String[] args) {        System.out.println(Thread.currentThread().getName()+"的"+Thread.currentThread().getPriority());        more more = new more();        Thread thread = new Thread(more);  Thread thread1 = new Thread(more);  Thread thread2 = new Thread(more);        thread.setPriority(Thread.MAX_PRIORITY);        thread1.setPriority(4);        thread2.setPriority(Thread.MIN_PRIORITY);        thread.start(); thread1.start(); thread2.start();    }}class more implements Runnable{    @Override    public void run() {        System.out.println(Thread.currentThread().getName()+"的"+Thread.currentThread().getPriority());    }}
5、线程守护

◆线程分为用户线程和守护线程

◆虚拟机必须确保用户线程执行完毕

◆虚拟机不用等待守护线程执行完毕

◆如:后台记录操作日志、监控内存、垃圾回收等待……

package com.cjg.xiancheng;public class threadDaemon {    public static void main(String[] args) {        me me = new me();        parents parents = new parents();        //设置守护线程        Thread thread = new Thread(me);        thread.setDaemon(true);        thread.start();        new Thread(parents).start();    }}class me implements Runnable{    @Override    public void run() {        while (true){            System.out.println("我守护着你");        }    }}class parents implements Runnable{    @Override    public void run() {        for (int i = 0; i <= 36500; i++) {            System.out.println("爸妈开心的活了"+i);        }        System.out.println("happy end");    }}
6、线程同步并发

队列加锁,保证线程安全,对应sql数据库的回滚。

◆由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronized,当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可,存在以下问题:

◆一个线程持有锁会导致其他所有需要此锁的线程挂起;

◆在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引 起性能问题;

◆如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题。

==每个线程在自己的工作内存交互,内存控制不当会造成数据不一致==

package com.cjg.xiancheng;public class syn {    public static void main(String[] args) {        buy buy = new buy();        new Thread(buy,"11111").start();  new Thread(buy,"2222222222").start();  new Thread(buy,"33333333333").start();    }}class  buy implements  Runnable{    private boolean flag=true;    private int tiket = 10;    @Override    public void run() {        while (flag){            try {                buyTikets();            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    private synchronized void buyTikets() throws InterruptedException {        if (tiket<=0){            flag=false;            return;        }        System.out.println(Thread.currentThread().getName()+"获得第"+tiket--+"票");        Thread.sleep(100);    }}//之前加锁的是 this  如果加锁不为 this 用程序块代替  . 注意索的是谁 ,需要增删改的对象synchronized (对象 obj){}

标签: #java线程详解