java学习——并发编程之多线程基础

一.基础知识

1.线程与进程

进程:进程是程序关于某项操作的一次运行活动,是操作系统进行资源调度和分配的单位。进程是线程的集合。

线程:线程是进程的一条执行路径,是cpu进行调度和分配的单位。

举例:进程就像是一个工厂,完成着cpu分配的任务,同一时刻只能有一条线程在执行,线程就好比是工厂的工人,许多工人同时完成任务。

2.什么是多线程

在同一时刻,有多条执行路径,多线程的目的是提高程序的运行效率。

3.多线程使用场景

迅雷下载、数据库连接池、分批发送短信。

4.多线程的创建方式

(1)继承Thread,重写run方法。

package com.zhu.mayi.thread_demo;

/**
 * Hello world!
 *
 */

//1.什么是线程?线程是进程的一条执行路径
//2.什么是多线程?多线程是在一个进程中,多条线程并发执行
//3.在一个进程中,一定会有主线程
//4.线程分为:主线程、子线程、GC线程、用户线程、守护线程
//多线程的实现方式? 1.继承thread类重写run方法 2.实现runnable接口 3.利用匿名内部类方式 4.使用线程池

//1.继承thread类重写run方法

class test extends Thread{
	
	@Override
	public void run() {
		for(int i = 0;i<10;i++){
			System.out.println("chird:i="+i);
		}
	}
	
}

public class threagTest1 
{
    public static void main( String[] args )
    {
    	System.out.println("主线程开始");
    	test test1 = new test();
    	test1.start();
    	for(int i = 0;i<10;i++){
    		System.out.println("main:i="+i);
    	}
    	System.out.println("主线程结束");
    }
}

(2)实现runnable接口。

package com.zhu.mayi.thread_demo;


class test2 implements Runnable{
	
	public void run() {
		for(int i = 0;i < 10;i++){
			System.out.println("i="+i);
		}
	}
	
}

//实现Runnable接口,重写run方法
/**
 * @author johson
 *
 */
public class threadTest2 {

	public static void main(String[] args){
		System.out.println("主线程开始");
		
		test2 test = new test2();
		
		Thread thread = new Thread(test);
		
		thread.start();
		
		for(int j = 0;j < 10;j++){
			System.out.println("j="+j);
		}
		
		System.out.println("主线程结束");
	}
	
}

(3)使用匿名内部类。

package com.zhu.mayi.thread_demo;

public class threadTest3 {
	
	//使用内部类方式
	public static void main(String[] args){
		
		System.out.println("主线程开始");
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				for(int i = 0;i < 10;i++){
					System.out.println("i=" + i);
				}
			}
		});
		
		thread.start();
		
		for(int j = 0;j < 10;j++){
			System.out.println("j=" + j);
		}
		
		System.out.println("主线程结束");
	}
	

}

(4)实现Callable接口。

未作实现

5.多线程的五种状态

(1)新建状态:线程刚被创建的时候,使用new关键字创建线程——new Thread(t),此时线程的代码还未执行。

(2)就绪状态:线程新建后,需要通过start()方法去执行。start()方法创建线程运行的系统资源,线程就进入了就绪状态。也就是说,就绪状态就是在线程创建后,获得cpu时间执行run()方法之前。

(3)运行状态:获得CPU时间后,它才进入运行状态,开始执行run()方法。

(4)阻塞状态:阻塞状态有以下几种情况:

a.线程调用了sleep()方法进入睡眠状态。

b.线程试图获取一个锁,但是这个锁正被其他线程占用,还未释放。

c.线程正在等待某个触发条件。

(5)死亡状态:死亡状态可能有以下原因造成:

a.run()方法正常执行完毕

b.程序发生异常,造成run()方法结束

为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false。

 

6.多线程的几种方法

a.join()方法

将执行权交给另一个线程。例如当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1。

b.Yield方法

Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果)

c.wait、notify方法

wait()暂定当前正在执行的线程,并释放资源锁,让其他线程可以有机会运行notify/notifyall: 唤醒因锁池中的线程,使之运行

d.sleep方法

sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

————————————————————————————————————————未完待续,欢迎各位大佬指出问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值