ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java 线程基础

2022-05-04 21:03:45  阅读:102  来源: 互联网

标签:java Thread void 基础 class 线程 new public


------------恢复内容开始------------

  • 线程的基本使用

在java中 线程使用有两种方式

1.继承Thread类,重写run方法

public class test1 {
    public static void main(String[] args) {
        //获取cpu 数
        Runtime runtime=Runtime.getRuntime();
        int num=runtime.availableProcessors();
        System.out.println(num);

        Cat cat=new Cat();
        cat.start();    //启动线程
    }
}

class Cat extends Thread{
    @Override
    public void run() {
        System.out.println("我是小猫咪");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2.实现Runnable接口,重写run方法

public class Thread02 {
    public static void main(String[] args) {
       Dog dog=new Dog();
       Thread thread=new Thread(dog);
       thread.start();
    }
}
class Dog implements Runnable{ @Override public void run() { int num=0; while (true){ try { Thread.sleep(1000); System.out.println(num+Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } num++; if(num>20)break; } } }

3.多线程执行售票(会出现线程同步和互斥问题,此处不考虑)

public class Thread03 {
    public static void main(String[] args) {
       SellTicket sellTicket=new SellTicket();
       Thread thread1=new Thread(sellTicket);
       thread1.start();
       Thread thread2=new Thread(sellTicket);
       thread2.start();
       Thread thread3=new Thread(sellTicket);
       thread3.start();
    }
}

class SellTicket implements Runnable{

    private int ticketNum=100;
    @Override
    public void run() {
        while (true){
            if(ticketNum<=0)break;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"买了一张票,还剩:"+--ticketNum);
        }
    }
}

线程的结束

1.当线程执行完毕自动结束

2.手动停止线程

public class Thread04 {
    public static void main(String[] args) throws InterruptedException {
        Tt tt = new Tt();
        tt.start();

        Thread.sleep(5*1000);
        tt.setLoop(false);
    }
}

class Tt extends Thread{
    private Boolean loop=true;
    private int num=0;
    @Override
    public void run() {
        while (loop){
            try {
                Thread.sleep(50);
                System.out.println(Thread.currentThread().getName()+num++ );
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public void setLoop(Boolean loop){
        this.loop=loop;
    }
}

线程常用的方法

线程插队

  yield:线程的礼让

  join: 线程的插队

package com.xxxx.server.controller.test;

public class Thread05 {
    public static void main(String[] args) throws InterruptedException {
        T t = new T();
        t.start();

        for (int i = 0; i < 20; i++) {
            Thread.sleep(1000);
            System.out.println("小弟正在吃"+i+"包子");
            if(i==5){
                t.join();
            }
        }
    }
}

class T extends Thread{

    @Override
    public void run() {
        int num=0;
        while (true){
            try {
                Thread.sleep(1000);
                System.out.println("大哥正在吃"+num+"包子");
                num++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(num>=20)break;
        }
    }
}

守护线程

package com.xxxx.server.controller.test;

public class Thread06 {
    public static void main(String[] args) throws InterruptedException {

        myDaemonThread myDaemonThread = new myDaemonThread();
        myDaemonThread.setDaemon(true);
        myDaemonThread.start();
        for (int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("宝宝在吃饭");
        }
    }
}

class myDaemonThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("爸爸妈妈在吃饭");
        }
    }
}

线程的生命周期(7个状态)

 

 线程的同步(synchronized)

可以在方法或者代码块上加锁

package com.xxxx.server.controller.test;

public class Thread03 {
    public static void main(String[] args) {
       SellTicket sellTicket=new SellTicket();
       Thread thread1=new Thread(sellTicket);
       thread1.start();
       Thread thread2=new Thread(sellTicket);
       thread2.start();
       Thread thread3=new Thread(sellTicket);
       thread3.start();
    }
}

class SellTicket implements Runnable{

    private int ticketNum=100;
    Boolean loop=true;
    @Override
    public void run() {
        while (loop){
            sell();
        }
    }
    //线程同步  添加互斥锁
    public synchronized void sell(){
        if(ticketNum<=0){
            System.out.println("票卖完了");
            this.loop=false;
            return;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"买了一张票,还剩:"+--ticketNum);
    }
}

上面同步的原理就是互斥锁

加在代码块的方式

 

 线程的死锁

当两个线程互相要抢对方锁的时候,就形成了死锁

 

释放锁

下面情况会释放锁

 

下面情况不会释放锁

 

标签:java,Thread,void,基础,class,线程,new,public
来源: https://www.cnblogs.com/zt-immortals/p/16222373.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有