java线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sky274548769/article/details/80687735

什么是线程:线程是一个轻量级的进程,简单来说,就是一个独立的代码程序,可以独立获取时间片进行代码的运行,什么是时间片,时间片指的是吧一秒钟Cpu能运行指令的次数,我们的程序都是获取CPU时间片来执行指令,获取的时间片越多,程序指令就执行越多,越流程。
目前我们的程序都是一个线程 main线程, 所以导致我们的程序执行的时候只能一条线的方式执行。 只能进行一个代码的执行。其他代码必须根据顺序才能执行。
我们可以利用线程,吧我们的程序做成多线程,不同的线程执行不同的代码, 一起执行多个代码。

实现线程的方式有两种
1、继承自Thread类 重写run方法


public class Plane extends Thread{

    public int x = 1000;
    //重写run方法
    public void run() {

        while(true) {
            this.x--;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(this.x);
        }


    }

}

2、实现自Runnable接口。

import java.text.SimpleDateFormat;
import java.util.Date;


public class DateThread2 implements Runnable{

    public void run() {
        while(true) {

            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

            String str = sdf.format(date);
            System.out.println(str);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

此处需要注意:我们启动线程是调用start方法,而不是调用run, 而我们关闭线程API虽然提供了一个stop方法,但是不安全,不建议使用stop方法,而是在我们线程把本身run方法里面相伴结束代码块。

线程的5种状态:
新建、就绪、运行、阻塞、结束

当我们创建一个线程对象的时候,该线程就进入新建状态,当我们调用线程的start方法,线程进入就绪状态,等待CPU分配时间片运行,当获取到 CPU时间片的时候,代码开始执行,进入运行状态。当运行时候我们调用sleep、join、yeild、join,还有其他一些方式导致改程序暂停运行就进入了阻塞状态,当阻塞结束后又进入就绪状态,然后进入运行状态,程序执行完成后该线程进入结束状态,然后等到CPU回收该内存。
这里写图片描述

线程方法详解:
1、setPriority(int newPriority)设置线程优先级,我们可以通过此方法设置线程的优先级,优先级越高获取时间片的概率就越大。
2、join() join(long millis) join(long millis, int nanos) ,线程合并,合并外部的线程,然后等待外部线程执行完毕后,在执行当前线程。
3、yield方法,就是线程让行的意思,本来该我获取时间片了,但是我不获取,让给别人去获取,我在获取下一次
4、wait和notify
wait方法:
wait()和wait(timeout) 第一个是一直进入等待状态, 第二个是进入等待状态,到时间自己往下 notify 和我们的wait是组合使用:

synchronized (Account.o) {
System.out.println(“输入密码”);
if( Account.balence>=200) {
System.out.println(name + “取钱200走了”);
Account.balence -= 200;
}else {
System.out.println(name + “余额不足!没法取钱”);
}

try {
Account.o.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

while(true) {

try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (Account.o) {
Account.o.notify();
}

}
Thread本身提供了一个stop方法,但是这个方法很不安全,我们不推荐使用这个方法,因为一般的线程都是一个循环体, 所以我们通过标志位 来结束循环达到结束线程目的

 public void run() {
        while(this.live) {
            this.x-= this.speed;

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

多线程:
线程并发;所谓的线程并发就是当我们多个程序操作同一个资源的时候,会造成资源重复操作。
解决方案就是加锁,synchronized
类锁

      synchronized (Ren.class) {
            System.out.println("输入密码");
            if( Account.balence>=200) {
                System.out.println(name + "取钱200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "余额不足!没法取钱");
            }

            System.out.println("取钱结束,余额为:" + Account.balence);

        }

线程异步:所谓的异步就是多个线程同时操作,有可能会操作到同一个资源,这样就会形成我们的资源误操作,这种方式效率高,速度快,不安全,容易资源误操作
线程同步:多个线程一起运行,但是后面的线程必须等前面的线程运行完成以后才能运行,效率低下,速度慢,安全,
所谓未来很多地方我们都需要实现线程同步!!!

  对象锁
public void run() {
        synchronized (Account.o) {
            System.out.println("输入密码");
            if( Account.balence>=200) {
                System.out.println(name + "取钱200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "余额不足!没法取钱");
            }

            System.out.println("取钱结束,余额为:" + Account.balence);

        }
    }
  方法锁
public synchronized void run() {
            System.out.println("输入密码");
            if( Account.balence>=200) {
                System.out.println(name + "取钱200走了");
                Account.balence -= 200;
            }else {
                System.out.println(name + "余额不足!没法取钱");
            }

            System.out.println("取钱结束,余额为:" + Account.balence);
    }

处理线程并发:一种方式是加锁, 另外一种方式是队列

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页