进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。
线程:就是在一个进程中负责一个执行路径。
多线程:就是在一个进程中多个执行路径同时执行。
多线程的好处:
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);
}
}
}
网友评论