温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

初学Java多线程的基本概念

发布时间:2020-05-27 03:57:28 来源:网络 阅读:135 作者:凉白开dream 栏目:编程语言

一:线程与之前所学的进程区别:
进程:系统进行资源分配的最小单位,资源是独立的
线程:CPU调度的最小的单位,线程间共享资源。多线程几个线程共占据一个进程,单线程独占一个线程。

主线程就像是前台接待,当工作量太多时,就指挥子线程去完成对应工作。

二,如何创建线程
继承Thread类和实现Runnable接口。
在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。

Thread构造函数:

public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

第一类:

public class ThreadDemo{
     public static void main(String[] args){
         Demo d = new Demo();//创建多线程
         d.start();//启动线程
         for(int i=0;i<60;i++){
             System.out.println(Thread.currentThread().getName()+i);//打印当前线程名称
         }

     }
 }
 class Demo extends Thread{//继承thread类
     public void run(){//run方法相当于线程的行动指南(做什么工作)
         for(int i=0;i<60;i++){
             System.out.println(Thread.currentThread().getName()+i);//打印名字
         }
     }
 }

第二类:
public class ThreadDemo{
public static void main(String[] args){
Demo d =new Demo();
Thread t = new Thread(d);//Thread类或它的子类的实例。
t.start();
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
class Demo implements Runnable{
public void run(){
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
三:如何终止线程。

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

  2. 使用stop方法强行终止线程(这个方法不推荐使用,可能发生不可预料的结果)。

  3. 使用interrupt方法中断线程。
    举例子:A通知B A.interrupt() A将指示灯置亮,B发生中断,(如果B睡着的话,会存在通知不及时的情况)
    B如何查看指示灯状态。Thread.interrupted()和Thread.isinterrupted()

    Thread.isinterrupted()会将指示灯复位,置回原来的状态。可查看任意线程的状态。
    Thread.interrupted()不会将指示灯复位,只可查看当前线程的状态。

    四:多线程安全问题
    问题原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另一个线程参与进来执行,导致共享数据的错误。

解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不执行。

两个关键字:
volatile修饰变量,实现可见性,当线程的工作内存数据改变,主内存也随之改变,
synchronized修饰方法,实现加锁功能,当CPU发生调度时,保证自己的工作不会受别人打扰。
同步代码块:


public class ThreadDemo3 {
    public static void main(String[] args){
        Ticket t =new Ticket();
        Thread t1 = new Thread("线程一");
        Thread t2 = new Thread("线程二");
        Thread t3 = new Thread("线程三");
        Thread t4 = new Thread("线程四");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Ticket implements Runnable{
    private int ticket =400;
    public void run(){
        while(true){
            synchronized (new Object()) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
    e.printStackTrace();
                }
                if(ticket<=0)
                    break;
                System.out.println(Thread.currentThread().getName()+ticket--);
            }
        }
    }
}

同步函数:
public class ThreadDemo3 {
    public static void main(String[] args){
        Ticket t =new Ticket();
          Thread t1 = new Thread("线程一");
        Thread t2 = new Thread("线程二");
        Thread t3 = new Thread("线程三");
        Thread t4 = new Thread("线程四"););
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Ticket implements Runnable{
    private int ticket = 4000;
    public synchronized void  saleTicket(){
        if(ticket>0)
            System.out.println(Thread.currentThread().getName()+ticket--);

    }
    public void run(){
        while(true){
            saleTicket();
        }
    }
}
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI