java多线程相关内容

首先说一下进程,进程是正在运行的程序,有自己的地址空间。进程的特点是具有动态性、并发性和独立性,线程就是进程内部的执行单元,进程里有无数个线程也就是轻量级进程,然后就是多线程,一个进程中同时运行了多个线程,用来完成不同的工作。

一、如何创建一个线程,创建线程有两种方式:

1、继承Thread,重写Thread类的Run方法

例:创建一个乌龟线程

public class TortoiseThread  extends Thread{

public void run() {
//线程体
super.run();
this.setName("乌龟线程");
while(true){
System.out.println("乌龟领先啦"+"---------->"+this.getName());
}
}
  
}

2、实现Runnable接口,实现Run方法

例:public class TortoiseRunnable implements Runnable{


public void run() {//线程体

while(true){
System.out.println("乌龟领先啦"+"---------->"+Thread.currentThread().getName());
}
}
}

二、启动线程

如果是继承Thread类,那么就,new一个线程类对象,然后调用start方法。

如果是实现了Runnable接口,那就先创建子线程对象,然后创建Thread对象,将子线程做形参传进来,再调用start方法。

三、两种方式的区别

1、继承Thread类的优点:编程简单

    缺点:已经继承了Thread类,无法继承其他类,有一定的局限性。

2、实现 Runnable接口优点:可以继承其他类,可以创建多个线程共享一个变量。

四、线程的的生命周期

新生状态:程序中用构造方法创建线程对象,有自己的内存空间。

就绪状态:新建线程,调用start方法进入就绪状态,但未必会执行。

运行状态:就绪状态的进程被调用,并获得CPU的资源,调用run方法。

阻塞状态:一个正在运行的程序执行一些耗时操作,如sleep(),就会暂停自己的进程进入就绪状态。

死亡状态:调用stop()方法,或者run()执行结束,进入死亡状态。

五、线程中的方法:

1、sleep()进入休眠状态,sleep(毫秒数),注:sleep()被哪个线程调用了,哪个线程就会进入休眠状态。

2、join()方法插入执行线程

3、yield()线程的礼让,让当前执行的线程暂停,不是阻塞,而是转入了就绪状态,如果调用了yield方法后,没有其他等待执行的进程,这时会马上恢复执行。

4、线程的优先级 getPriority() 和 setPriority(值)

六、线程同步

当多个线程访问同一个资源时,会出现数据不一致的问题,例如出现负数。

解决的方案就是线程加锁,加锁有同步代码块、同步方法的方式

1、同步代码块

synchronized(对象){
//同步的代码
}

2、同步方法

如果是非静态方法

【访问修饰符】synchronized 返回值类型 方法名([形参列表]){
//同步方法体
}
同步非静态方法锁对象是this

如果是静态方法

【访问修饰符】static synchronized 返回值类型 方法名([形参列表]){
   //同步方法体
 }
同步静态方法的锁对象是类的字节码


七、线程同步的优缺点
优点:解决多线程访问与处理共享数据不一致的问题
缺点:降低了效率,容易造成死锁

猜你喜欢

转载自blog.csdn.net/hhoo3344521/article/details/52336689