多线程(Thread)

本文详细介绍了Java中的多线程概念,包括进程、线程的定义,多线程的优点,主线程的作用,创建线程的两种方式(继承Thread类和实现Runnable接口),线程状态及其生命周期,线程调度的方法,以及synchronized关键字在解决线程安全问题中的应用。通过实例分析,阐述了如何编写安全的多线程程序。

进程

定义:应用程序的执行实例(最小单位);有独立的内存空间与系统资源

线程

定义:包含在进程里面;CPU调度与分派的基本单位;执行运算的最小单位,可以完成独立的顺序流程的控制

多线程定义

一个进程当中同时运行了多个线程,用来完成不同的工作,这就叫做多线程

优点

1.充分利用CPU的资源

2.简化编程模型

3.带来良好的用户体验

主线程

main()方法就是主线程的入口

产生其他子线程的线程

必须最后完成,因为他要执行各种的关闭动作

使用线程步骤

1.定义线程

2.创建线程对象

3.启动线程

4.终止线程

创建线程的两种方式

继承Thread类

1.定义MyThread类继承Thread类

2.重写run方法,编写线程执行体

3.创建线程对象,调用start()方法开启线程

public class MyThread extends Thread{
    //重写run()方法
	public void run(){
		for(int i=1;i<100;i++){			
            System.out.println(Thread.currentThread().getName()+":"+i);
            // Thread.currentThread() 获取当前线程对象       
        }
    }
}

public static void main(String[] args) {
		MyThread thread = new MyThread();
		thread.start(); //启动线程}

}

实现Runnable接口

1.定义MyRunnable类实现Runnable的接口

2.实现run方法,编写线程执行体

3.创建线程对象,调用start()方法启动线程

public class MyRunnable implements Runnable{
	public void run(){
		for(int i=1;i<100;i++){			
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}


public static void main(String[] args) {
		MyRunnable myRunnable = new MyRunnable();
		Thread myThread = new Thread(myRunnable);	
		myThread.start(); //启动线程}
}

使用线程的注意点

1.多线程交替执行,并不是一起执行,总有先后但是时间很短,看不出来

2.每次线程执行的时长是由分配的CPU时间片长度决定的

3.开启线程不能用run()方法,用run()只是调用搞线程类的方法,并不是开启线程

线程的状态(生命周期)

1.创建状态

2.就绪状态

3.阻塞状态

4.运行状态

5.死亡状态

线程调度的相应方法

setPriority(int  newPriority)--->设置线程的优先级

static void sleep(long millis)--->在指定的毫秒数内让当前正在执行的线程休眠

void join()--->等待该线程终止

static void yield()--->暂停当前正在执行的线程对象,并执行其他线程(不一定会礼让)

void interrupt()--->中断线程,不是真的中断,而是到达某种状态,运行另一段线程;

boolean isAlive()--->测试线程是否处于活动状态

synchronized关键字

作用:用来解决多个线程操作同一共享资源时,将引发的数据不安全的问题(为当前的线程声明一个锁,该类资源等待该线程做完之后其他线程才能访问)

使用方式

1.同步方法

2.同步代码块(锁对象属于实例对象时用this;锁对象属于静态变量时用类名.class)

package threadDome2;

public class QpRunnable implements Runnable {
//多线程抢票
	private int count = 20;// 记录总票数
	private int num;// 购买的票数
	private boolean flag = true;

	@Override
	public void run() {
		while (flag) {
			synchronized (this) {
				if (count < 1) {
					flag = false;
					return;
				}
				count--;
				num++;
				System.out.println(Thread.currentThread().getName() + "抢了第" + num + 
						"张票,总票数还剩余" + count + "张票!");
			}
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
}

线程安全

多线程操作同一事务时可能带来的数据不一致的问题

线程安全与不安全的常用对象

安全

Vector

Hashtable

StringBuffer

效率低,有多低看你锁的量级 

不安全

ArrayList

HashMap

StringBuilder

合格的书写多线程

1.对建线程的控制

2.对拒绝建线程提出策略

3.尽量少写线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值