关于线程的知识点

  进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。

    线程:就是在一个进程中负责一个执行路径。

    多线程:就是在一个进程中多个执行路径同时执行。

多线程的好处:

1.解决了一个进程里面可以同时运行多个任务(执行路径)。

2.提供资源的利用率,而不是提供效率。

多线程的弊端:

1.降低了一个进程里面的线程的执行频率。

2.对线程进行管理要求额外的CPU开销。线程的使用会给系统带来上下文切换的额外负担。

3.公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,发生线程安全问题。

4.线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。

1.1线程的状态

创建:新创建了一个线程对象。

可运行:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取cpu的执行权。

运行:就绪状态的线程获取了CPU执行权,执行程序代码。

阻临时塞:阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

死亡:线程执行完它的任务时。

1.1常见线程的方法

Thread(String name)初始化线程的名字

getName()返回线程的名字

setName(String name)设置线程对象名

sleep()线程睡眠指定的毫秒数。

getPriority()返回当前线程对象的优先级   默认线程的优先级是5

setPriority(int newPriority)设置线程的优先级    虽然设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10,最小的1, 默认是5)。

currentThread()返回CPU正在执行的线程的对象

1.1创建线程的方式二

创建线程的第二种方式.使用Runnable接口.

该类中的代码就是对线程要执行的任务的定义.

1:定义了实现Runnable接口

2:重写Runnable接口中的run方法,就是将线程运行的代码放入在run方法中

3:通过Thread类建立线程对象

4:将Runnable接口的子类对象作为实际参数,传递给Thread类构造方法

5:调用Thread类的start方法开启线程,并调用Runable接口子类run方法

为什么要将Runnable接口的子类对象传递给Thread的构造函数,因为自定义的run方法所属对象是Runnable接口的子类对象,所以要让线程去执行指定对象的run方法

关于线程的通讯的代码

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

生产者消费者

如果有多个生产者和消费者,一定要使用while循环判断标记,然后在使用notifyAll唤醒,否者容易只用notify容易出现只唤醒本方线程情况,导致程序中的所有线程都在等待。

例如:有一个数据存储空间,划分为两个部分,一部分存储人的姓名,一部分存储性别,我们开启一个线程,不停地想其中存储姓名和性别(生产者),开启另一个线程从数据存储空间中取出数据(消费者)。

由于是多线程的,就需要考虑,假如生产者刚向数据存储空间中添加了一个人名,还没有来得及添加性别,cpu就切换到了消费者的线程,消费者就会将这个人的姓名和上一个人的性别进行了输出。

还有一种情况是生产者生产了若干次数据,消费者才开始取数据,或者消费者取出数据后,没有等到消费者放入新的数据,消费者又重复的取出自己已经去过的数据。

publicclassDemo10 {

publicstaticvoidmain(String[] args) {

Person p =newPerson();

Producer pro =newProducer(p);

Consumercon =newConsumer(p);

Thread t1 =newThread(pro,"生产者");

Thread t2 =newThread(con,"消费者");

t1.start();

t2.start();

}

}

//使用Person作为数据存储空间

classPerson {

Stringname;

Stringgender;

}

//生产者

classProducerimplementsRunnable {

Personp;

publicProducer() {

}

publicProducer(Person p) {

this.p= p;

}

@Override

publicvoidrun() {

inti = 0;

while(true) {

if(i % 2 == 0) {

p.name="jack";

p.gender="man";

}else{

p.name="小丽";

p.gender="女";

}

i++;

}

}

}

//消费者

classConsumerimplementsRunnable {

Personp;

publicConsumer() {

}

publicConsumer(Person p) {

this.p= p;

}

@Override

publicvoidrun() {

while(true) {

System.out.println("name:"+p.name+"---gnder:"+p.gender);

}

}

}




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,515评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,002评论 1 18
  • 工具:触屏手机一个,触屏笔一支,手机绘图软件随便哪一个(PS相关类似类似……) 1.先打个线稿。 2.选个浅一点的...
    时非见阅读 608评论 7 3
  • 一、随处可见的饰品店 就是这种一件件的小饰品不知道为何会有一种魔力让人忍不住停下脚步,然后就会忍不住把玩一翻。 二...
    象牙塔小姐呀阅读 419评论 1 2
  • 林语堂在《生活的艺术》里说:“人生的目的除了去享受人生外,还有什么呢?”工作固然重要,但工作之外我们更要懂得享受生...
    农场日记阅读 1,650评论 0 3