多线程知识点简单总结

一、进程与多线程的概念及线程的优点

进程:操作系统的基本运行单元,是程序的一次执行。

线程:在进程中独立运行的子任务。

Eg:QQ是一个进程,则好友视频,下载文件,数据传输等都是线程。


单任务:排队执行,一个时间就一个线程执行,也就是同步。

多任务:一个时间有多个线程同时执行,也就是异步。


二、多线程讲解

1.线程的创建

一种是继承Thread类,,另一种是实现Runnable接口。两种方法没有本质的区别,因为Thread类在底层也是实现了Runnable接口,

但是继承Thread类的方法不支持多继承。

先是Thread方法:

<span style="font-family:KaiTi_GB2312;font-size:14px;">public class MyThread extends Thread {
	@Override
	public void run () {
		super.run();
		System.out.println("MyThread");
	}
}

public class RunTest() {
	public static void main(String [] args) {
		MyThread thread = new MyThread();
		thread.start();
		System.out.println("main运行结束");
	}
}</span>

上面是基本的创建以及线程调用的方法(Start())。


运行的结果是

MyThread
main运行结束

或者顺序倒过来,都有可能,因为在多线程中,代码的运行结果和代码的执行顺序是无关的。


2.Runnable的使用

<span style="font-family:KaiTi_GB2312;font-size:14px;">public class MyRunnable implements Runnable {
	@Override
	public void run () {
		super.run();
		System.out.println("Runnable");
	}
}

public class RunTest() {
	public static void main(String [] args) {
		Runnable run  = new MyRunnable();
		Thread thread = new Thread(run);
		thread.start();
		System.out.println("main运行结束");
	}
}
</span>

这里看到Thread类在创建时传递了一个实现了Runnable的实例参数,,这就是Runnable的使用方式

在Thread类中,常用的几个构造方法有:

Thread()

Thread(Runnable target) 

Thread(Runnable target,String name) 


这里有一个概念是

非线程安全:主要是指对个线程对同一个对象中的同一个实例变量进行操作时,会出现的值被更改,值不同步的情况,进而影响程序的执行流程

Eg:  大象装冰箱的操作,分三步,打开冰箱门,装进去,关上。但是要是多线程,在你打开之后另一个线程给你关了,大象装哪?这就产生了非线程安全。


解决的办法是:在run方法前加上synchronized关键字,这样run方法的执行实际上是排队执行的。

synchronized 可以对任意对象和方法加锁,而加锁的这段代码称为“互斥区或临界区”。



三、多线程中的方法

1.线程启动  :start(),重新创建一个线程,并执行run方法。

如果在main中写MyThread.run(),则只能是当做普通的函数调用一样,和多线程没有什么关系。

2.currentThread()方法返回代码正在被哪个线程调用的信息。currentThread().getName();

3.isAlive()是否处于活动状态

4.getId()返回线程的唯一标识


5.停止线程 :可以用stop(). 但是这个是线程不安全的 。

因为强行停止的话一些清理工作可能还来不及处理,还有一个问题就是对锁定的对象进行了解锁,导致数据得不到同步处理,出现不一致的问题。

所以这种方法现在以及不要

推荐用interrupt(),这个方法不会终止一个正在运行的线程,而是会加入一些判断才停止。

6.interrupted():测试当前线程是否已经中断。

7、暂停和恢复:suspend()和resume()也会导致数据不同步问题,所以也不用了。

8.yield():放弃当前CPU资源,但是放弃的时间不确定。

9.设置优先级:setProperty().线程优先级有10个,1-10,可设置。

注意:线程的优先级具有继承性。

即:A线程启动B线程,则B线程的优先级和A一样。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值