作者: 别把微笑给了狗 | 来源:发表于2016-12-05 17:30 被阅读0次

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

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

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

    多线程的好处:

    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);

    }

    }

    }


    相关文章

      网友评论

          本文标题:

          本文链接:https://www.haomeiwen.com/subject/qsflmttx.html