菜鸟java学习第五篇 线程

进程:是一个正在执行中的程序,每一个程序开启都会在内存中分配一片空间,进程就是用来标识这片空间的。

线程:进程中的一个独立的控制单元(执行路径),线程在控制着进程的执行也就是说真正执行的是进程中的线程

多线程:一个进程中有多个线程在同时进行

多线程存在的意义:可以使多部分代码同时执行,提高执行效率

 

多线程的特点:随机性

 

Thread类中几个方法:

currentThread();//静态方法,返回是当前正在执行的线程对象

getName();//获取线程的名称

setName();//定义线程的名称  也可在构造方法中传入线程名称

创建线程的方式:

第一种:步骤:1.自定义类继承Thread类。

                            2.复写Thread类中的run方法

                                     为了将自定义线程需要运行的代码存储进run方法,也就是说run方法中定义的是自定义线程的执行代码

                            3.调用线程的start方法,开启线程。

                   Start方法的两个作用:一启动了线程  二调用run方法

Start方法会新建一个线程去执行这个代码

第二各:步骤:1.自定义类去实现Runnable接口

                            2.实现Runnable接口中的run方法

                            3.通过Thread类创建线程对象

                            4.将创建的Runnable接口的子类对象作为参数传递给Thread类的构造函数

                                            因为需要线程去运行run方法中的代码

               5.通过start方法开启线程。

 

第二种的好处:避免了单继承的局限性

多线程存在安全隐患

不安全的原因:当多条语句在操作同一个共享数据时,如果一个线程对多语句只执行了一部分还没有执行完,另一个线程参与进行执行,导致了共享数据的错乱

如何解决安全问题?

      同步代码块:格式

                                               synchronized(对象) {        //同步代码块

                                                         需要被同步的代码

                                               }

同步的前提:1.有两个或两个以上的线程在操作相同的代码

2.必须多个线程使用的是同一个锁。

 

同步的好处:解决了多线程的安全问题

弊端:线程需要判断,较为消耗资源

查找需要同步的代码块

(需要被多线程执行   操作了共享数据   哪些语句在操作这个共享数据)

 

同步的两种表现形式:1.同步代码块 2.同步函数 在方法定义时加上synchronized关键字

同步函数的锁是this 也就是它的对象

函数为static时   对象就不是 this

静态同步函数的锁是本类字节码对象,也就是类名.class

 线程的五种状态:

 

   

 

同步可能会出现死锁

死锁一般会出现在同步互相嵌套的情况下,而且所持有的锁不同造成的

 

线程间的通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。

 

JDK5.0对多线程进行了升级:将同步synchronized替换成显式的lock操作,将object中的wait,notify,notifyAll替换成了Condition对象(该对象可以用lock中的newCondition方法进行获取)

 

升级之后好处:一个锁可以绑定多个condition对象

Interrupt方法:让处于冻结状态的线程强制恢复到运行状态,但是会发生interruptedException异常

守护线程:当程序中都是守护线程时,JVM会退出

用    线程名.setDaemon(true);将该线程设置为守护线程。

注意:必须在线程开启前调用

 

 

 join方法  :等待线程结束,在哪个线程中调用另一个线程的join方法,则该线程需要在另一个线程执行完毕后再执行

 

yield()方法暂停当前正在执行的线程对象,并执行其他线程

 

线程最重要的是匿名内部类使用  例子在ThreadTest4.java

package thread;
//ThreadTest4.java
public class ThreadTest4 {
	public static void main(String[] args) {
		new Thread() {<span style="white-space:pre">		</span>//创建匿名内部类
			@Override
			public void run() {<span style="white-space:pre">		</span>//重写Thread类的run()方法
				for (int i = 0; i < 50; i++) {
					System.out.println("bbb" + i);
				}
				super.run();
			}
		}.start();
		for (int i = 0; i < 50; i++) {
			System.out.println("aaa" + i);
		}
		Runnable runnable=new Runnable() {

			@Override
			public void run() { <span style="font-family: Arial, Helvetica, sans-serif;">//重写Thread类的run()方法</span>

				for (int i = 0; i < 50; i++) {
					System.out.println("ccc" + i);
				}
			}
		};
		new Thread(runnable).start();<span style="white-space:pre">	</span>//开启线程
	}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值