黑马程序员_线程

来源:互联网 发布:高中算法初步程序语言 编辑:程序博客网 时间:2024/05/16 10:26

------- android培训、java培训、期待与您交流! --------

线程

进程:通常将正在运行的程序称为进程。

线程:可以将进程内部的任务称为线程。

           线程是进程中的实体,一个进程可以拥有多个线程。

多进程:指在操作系统中可以同时运行多个任务(程序)。

多线程:是指在同一应用程序中,同时存在几个执行体,按几条不同的执行路线共同工作的情况。线程弊端:线程太多回收效率低

线程好处:解决了多部分同时运行的问题。

创建线程的目的:未来开启一条执行路径,去执行指定的代码和其他代码实现同时运行,jvm创建的线程都定义在主函数中,而自定义的线程通过thread类种的run()方法。

方式一:定义一个类继承thread类,覆盖run()方法。

步骤:

1)定义一个继承thread类

2)覆盖thread类中的run()方法

3)直接创建thread类的子类。

4)调用strsrt方法并调用线程的任务。

5)可以使用getName()方法获取线程的名称。

方式二:实现Runnable接口

        步骤1)覆盖就接口中的run方法将线程的任务代码封装到run 方法中

1)     通过Thread创建线程对象

2)     调用线程对象的Start方法开启线程。

Thread类中的主要的方法包括:

start()方法:此方法用于启动线程;

run()方法:此方法为线程的主体方法,可以根据需要重写run()方法。此线程完成什么功能,主要运用run()方法中的代码去实现。

线程的优先级

在Java语言中,线程有执行的优先级别,优先级的范围是1~10,默认值为5,可以使用Thread类中setPriority()方法来设定线程的优先级,但必须是在1~10的范围内,否则会出现异常。

优先权较高的线程会被提前执行,当它执行完毕才会轮到优先权较低的线程执行。如果优先权相同,那么采用轮流执行的方式

 

 

 

 

 

 

 

 

 

线程安全问题产生的原因

1)多个线程在操作共享数据

2)操作共享数据的线程有多条

3)当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算,就会产生线程安全问题得产生。

解决方案:将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码时,其他线程是不可以参与运算的,必须要当前线程把这些代码都执行完后,其他线程才可以参与运算。

在java中用同步代码块解决这个问题

Synchronized(对象)

{

   需要同步的代码}

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

同步的弊端:相对效率降低了 ,因为同步外的线程都会判断同步线程锁
同步的前提: 必须有多个线程并使用同一个锁。

Java 中多线程同步是什么

 在多线程程序下同步能控制对共享资源的访问。如果没有同步当一个 Java 线程在修改一个共享变量时另外一个线程正在使用或者更新同一个变量这样容易导致程序出现错误的结果。 1.解释实现多线程的几种方法? 一 Java 线程可以实现 Runnable 接口或者继承 Thread 类来实现当你打算多重继承时优先选择实现 Runnable。 2.Thread.start ()与 Thread.run ()有什么区别 Thread.start ()方法(native)启动线程使之进入就绪状态当 cpu 分配时间该线程时由 JVM 调度执行 run ()方法。

.什么时候抛出InvalidMonitorStateException 异常为什么

                                                    调用 wait ()/notify ()/notifyAll ()中的任何一个方法时如果当前线程没有获得该对象的锁那么就会抛出 IllegalMonitorStateException的异常(也就是说程序在没有执行对象的任何同步块或者同步方法时仍然尝试调用 wait ()/notify()/notifyAll ()时)。由于该异常是 RuntimeExcpetion 的子类所以该异常不一定要捕获(尽管你可以捕获只要你愿意).作为 RuntimeException此类异常不会在 wait (),notify(),notifyAll ()的方法签名提及

.在静态方法上使用同步时会发生什么事

                                         同步静态方法时会获取该类的“Class”对象所以当一个线程进入同步的静态方法中时线程监视器获取类本身的对象锁其它线程不能进入这个类的任何静态同步方法。它不像实例方法因为多个线程可以同时访问不同实例同步实例方法。

注意:同步函数的锁是this

同步函数与同步代码块区别

                      同步函数用的锁是this

                       同步代码块的锁是任意对象

静态同步函数中用的锁一定不是this.,他使用的锁就是该函数所属字节码文件对象,可以用getclass方法获取也可以用当前类名.Class表示

线程通信:  多个线程在处理同一个资源,但是任务不同

等待/唤醒机制:wait()让线程处于冻结状态,被wait的的线程会被·储存在线程池中

               Notify()唤醒线程池中任意线程

               Notifyall():唤醒线程池中的所有线程。

注意:这些方法必须都定义在同步中,因为这些方法是用于操作线程状态的方法,必须明确到底操作的是那个锁上的线程。

为什么操作线程的方法定义在了object类中,

因为这些方法是监视器的方法,监视器就是锁

所可以是任意对象,任意的对象调用的的方式一定定义在object类中。

Sleep和wait方法的区别:

1)Wait:可以制定时间也可以不指定,sleep必须指定时间

2)在同步中对、cpu的执行权和锁的处理不同

Wait释放执行权,释放锁

Sleep:释放执行权,不释放锁

怎么控制线程任务结束:任务中都会有循环结构,只要控制循环就可以结束任务

控制循环通常用定义标记来完成。

如果线程处于了冻结状态,就无法读取标记。

可以使用interrupt方法,可以使线程从冻结状态强制恢复到运行状态中,让线程具备cpu的执行资格,当强制是会发生中断异常,记得处理。

线程的控制

线程的控制包括线程的启动、挂起、状态检查以及如何正确结束线程,由于在程序中使用多线程,为合理安排线程的执行顺序,可以对线程进行相应的控制。

 线程的启动

一个新的线程被创建后处于初始状态,即就绪状态,当轮到这个线程执行时(获得CPU),进入“运行”状态,开始执行线程run()方法中的代码。

调用start()方法启动线程,运行run()方法。程序继续执行start()方法下面的语句,这时run()方法可能还在运行,这样,就实现了多任务操作。

2   线程的挂起

线程的挂起操作实质上就是使线程进入“阻塞” (“非可执行”)状态,在这个状态下,CPU不会分给线程时间段,进入这个状态可以用来暂停一个线程的运行,在线程挂起后,可以通过重新唤醒线程来使之恢复运行。

引起线程挂起的原因:

(1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。

例如:想让线程休眠1.5秒钟,即1 500毫秒,可以使用如下代码。

try { Thread.sleep(1500);       // 使线程休眠1500毫秒

} catch (InterruptedException e) {      }

引起线程挂起的原因

(2)通过调用join()方法使线程挂起。如果存在两个线程A和B,想让线程B挂起,线程A执行结束后再执行B,线程A可调用join()方法。

public Thread3 extends Thread{

    ……

    Thread3 A=new Thread3();

    Thread3 B=new Thread3();

    A.start();

 try{

    A.join();  }catch( Exception e){}

    B.start();    

}

(3)通过调用wait()方法使线程挂起,直到线程得到了notify()和notifyAll()消息,线程才会进入“可执行”状态。例如:

      thread.wait(1000);//让线程挂起1秒

     thread.notify();  //唤醒线程

(4)线程在等待某个输入/输出完成。

 线程状态检查

isAlive()方法用于测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。

语法格式为:

thread.isAlive();

thread:这是一个线程对象,isAlive()方法将判断该线程的活动状态。

 结束线程

结束线程有两种情况:

(1)自然消亡:一个线程从run()方法的结尾处返回,自然消亡且不能再被运行;

(2)强制死亡:调用Thread类中stop()方法强制停止,不过该方法已经被废弃。

 后台线程

后台线程,即Daemon线程,它是一个在后台执行服务的线程。

例如操作系统中的隐藏线程和Java语言中的垃圾自动回收线程等。如果所有的非后台线程都结束了,则后台线程也会自动终止。

 





--------- android培训、java培训、期待与您交流! ----------

原创粉丝点击