Java线程

本章主要将:

 

进程

 

多线程的创建

 

多线程的特性

 

1.什么是进程?

每个应用程序都对应一个进程,拥有分配资源的权利

为了完成一个进程中的多个对象的控制,一个进程分

为了多个线程

 

2.线程的创建

 

创建线程的方式一:

继承Thread类

    子类覆盖父类中的run方法,将线程运行的代码存放在run中

    建立子类对象的同时线程也被创建

    通过调用start方法开启线程

案例:

 

public static void main(String[] args) {

 Test t1 = new Test("haoren");

 t1.start();

 Test t2 = new Test("huairen");

 t2.start();

 }

 

class Test extends Thread{

 private String name;

 

 public Test(String name){

  this.name = name;

 }

 

 public void run(){

  for(int i=0;i<10;i++){

   System.out.println(name+":"+i);

  }

 }

}

 

用Thread的注意事项

 

native 表示要调用操作系统的函数

多次调用start()会报异常

t2.start();

 //t2.start();//同一个多次调用会报异常

 

一个java程序中至少有两个线程一个是main主线程,还有一个是垃圾回收的线程

 

创建线程的方式二:

实现Runnable接口:

子类覆盖接口中的run方法。

通过Thread类创建线程,并将实现了

Runnable接口的子类对象作为参数传递给

Thread类的构造函数。

 

Thread类对象调用start方法开启线程

   

 

Thread和Runnable的关系:

Thread是Runnable 的子类

实际上Thread和Runable的关系和我们前边讲的代理设计模式很像, 这里的Thread就是代理类。我们自己所实现的类才是real

 

Thread和Runnable 的区别

Runnable可以共享数据(见案例)

 

 

3.线程中的常用方法:

getName() 取得和设置线程名字

isAlive() 判断线程是否启动

sleep(long millis) 线程休眠

join() 强制执行线程

interrupt() 中断线程的某种状态

 

 

线程的各种状态:

 

1.创建状态

在程序中用构造方法创建了一个线程后,新的线程对象便处于新建状态,此时它已经有了相应的内存空间和其他资源,但还处于不可运行的状态。新建一个线程对象可采用Thread类的构造方法来实现。例如 Thread thread = new Thread()

 

2.就绪状态

新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件

 

3.运行状态

当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时自动调用该线程对象的run方法。run法法定义了该线程的操作和功能

 

4.堵塞状态

一个正在执行的线程在某些特殊情况下。如被人挂起或需要执行耗时间的输入输出操作时,将让出CPU并暂时中止自己的执行,进入堵塞状态。在可执行状态下,如果调用sleep(),suspend(),wait()方法等,线程都将进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因消除后,消除才可以转入就绪状态

 

5.死亡状态

线程调用stop()方法时或run()方法执行结束后,即处于死亡状态,处于死亡状态下的线程不具有继续运行的能力

 

注意:尽量不要使用stop方法强制停止线程会让程序处于不可控状态

正确的方法是:让线程自然死掉

本章主要将:

进程

多线程的创建

多线程的特性

1.什么是进程?
每个应用程序都对应一个进程,拥有分配资源的权利
为了完成一个进程中的多个对象的控制,一个进程分
为了多个线程

2.线程的创建

创建线程的方式一:
继承Thread类
    子类覆盖父类中的run方法,将线程运行的代码存放在run中
    建立子类对象的同时线程也被创建
    通过调用start方法开启线程
案例:

public static void main(String[] args) {
    Test t1 = new Test("haoren");
    t1.start();
    Test t2 = new Test("huairen");
    t2.start();
    }

class Test extends Thread{
    private String name;
    
    public  Test(String name){
        this.name = name;
    }
    
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println(name+":"+i);
        }
    }
}

用Thread的注意事项

native 表示要调用操作系统的函数
多次调用start()会报异常
t2.start();
    //t2.start();//同一个多次调用会报异常

一个java程序中至少有两个线程一个是main主线程,还有一个是垃圾回收的线程

创建线程的方式二:
实现Runnable接口:
子类覆盖接口中的run方法。
通过Thread类创建线程,并将实现了
Runnable接口的子类对象作为参数传递给
Thread类的构造函数。

Thread类对象调用start方法开启线程
   

Thread和Runnable的关系:
Thread是Runnable 的子类
实际上Thread和Runable的关系和我们前边讲的代理设计模式很像,  这里的Thread就是代理类。我们自己所实现的类才是real

Thread和Runnable 的区别
Runnable可以共享数据(见案例)

package com.java;
import java.util.concurrent.atomic.AtomicInteger;
public class thread {
    public static void main(String[] args) {
        PriceTicket tick1 = new PriceTicket();
        PriceTicket tick2 = new PriceTicket();
        PriceTicket tick3 = new PriceTicket();
        PriceTicket tick4 = new PriceTicket();
        PriceTicket tick5 = new PriceTicket();
        tick1.start();
        tick2.start();
        tick3.start();
        tick4.start();
        tick5.start();
    }
}
class PriceTicket extends Thread{
    static int a = 0;
    @Override
    public void run() {
        while(Ticket.getTicketSum()>0){
            a++;
            System.out.println(Thread.currentThread().getName()+"购买了一张票还剩余"+Ticket.deleteTicketSum()+"张");
        }
        System.out.println("一共卖了"+a+"张");

    }
}

class Ticket{
    static AtomicInteger atom = new AtomicInteger(100);
    public static int deleteTicketSum(){
        return atom.decrementAndGet();
    }
    public static int getTicketSum(){
        return atom.get();
    }
}


3.线程中的常用方法:
getName() 取得和设置线程名字
isAlive() 判断线程是否启动
sleep(long millis) 线程休眠
join() 强制执行线程
interrupt() 中断线程的某种状态


线程的各种状态:

1.创建状态
在程序中用构造方法创建了一个线程后,新的线程对象便处于新建状态,此时它已经有了相应的内存空间和其他资源,但还处于不可运行的状态。新建一个线程对象可采用Thread类的构造方法来实现。例如 Thread thread = new Thread()

2.就绪状态
新建线程对象后,调用该线程的start()方法就可以启动线程。当线程启动时,线程进入就绪状态。此时,线程将进入线程队列排队,等待CPU服务,这表明它已经具备了运行条件

3.运行状态
当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时自动调用该线程对象的run方法。run法法定义了该线程的操作和功能

4.堵塞状态
一个正在执行的线程在某些特殊情况下。如被人挂起或需要执行耗时间的输入输出操作时,将让出CPU并暂时中止自己的执行,进入堵塞状态。在可执行状态下,如果调用sleep(),suspend(),wait()方法等,线程都将进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因消除后,消除才可以转入就绪状态

5.死亡状态
线程调用stop()方法时或run()方法执行结束后,即处于死亡状态,处于死亡状态下的线程不具有继续运行的能力

注意:尽量不要使用stop方法强制停止线程会让程序处于不可控状态
正确的方法是:让线程自然死掉
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值