多线程

线程概述:

1、进程与线程基本概念
(1)进程:执行中的程序
每个进程都有独立的代码和数据空间(进程上下文),进程空间切换会有较大的开销,一个进程包含1-n个线程。进程是资源分配的最小单位。

(2) 线程:进程的执行单元,线程依靠进程运行,只能使用分配给进程的资源
同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器,线程切换开销小。线程是cpu调度的最小单位。

(3) 单线程
程序中只存在一个线程

(4) 多线程
一个程序中运行多个任务(同一程序中有多个顺序流在执行)

二、线程实现
(1)继承Thread类
① 通过继承Thread类定义它的子类,并重写该类的run()方法,该方法的方法体代表线程需要完成的任务。因此把run方法称为线程执行体。
② 创建Thread类子类的实例,即创建线程对象。
③ 调用线程对象start()方法来启动线程。
创建一个线程类

public class Thread1 extends Thread {
private int i = 0;
public Thread1(String name)
{
super(name);
}
public void run()
{
for(; i<10; i++)
{
//当线程类继承Thread类时,直接使用this即可获得当前线程
//Thread对象的getName()返回当前线程名字
//直接调用getName()获取当前线程名字
System.out.println(“Thread”+getName()+" "+i);
}
}
}

public void testRun() {
for(int i=0; i<10; i++)
{
System.out.println(Thread.currentThread().getName()+" “+i);
if(i==5)
{
new Thread1(i+”-1").start();
new Thread1(i+"-2").start();
}
}
}

Runnable接口

① 定义Runnable 接口的实现类,并重写该接口的run()方法,该方法的方法体是线程的执行体。
② 创建Runnable实现类的实例
③ 调用线程对象的start()方法启动线程。

public class Runnable2 implements Runnable {
private String name;
public Runnable2(String name)
{
this.name = name;
}
public void run() {
for(int i=0; i<10; i++)
{
System.out.println(this.name+" "+i);
}
}
public void start()
{
new Thread(new Runnable2(this.name)).start();
}
}
public void testRun() {

for(int i=0; i<10; i++)
{
System.out.println(Thread.currentThread().getName()+" “+i);
if(i==4)
{
new Runnable2(i+”-1").start();
new Runnable2(i+"-2").start();
new Runnable2(i+"-3").start();
}
}
}
三、 运行与阻塞
(1)如果处于就绪状态的线程获得了CPU资源,开始执行run()方法的线程执行体,则该线程处于运动状态,如果计算机只有一个CPU,那么在任何时刻只有一个线程处于运行状态。
当如下情况发生,线程将会进入阻塞状态:
① 线程调用sleep()方法主动放弃所占用的CPU资源;
② 线程调用了一个阻塞式IO方法,在该方法返回前,该线程被阻塞;
③ 线程试图获取一个同步监视器(同步锁),但是该同步锁正在被其他线程所持有;
④ 线程在等待某个通知(notify);
⑤ 程序调用了线程的suspend()方法将它挂起;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值