NO9.Java笔记【多线程】

来源:互联网 发布:景区票务系统源码 编辑:程序博客网 时间:2024/06/03 15:32

进程:正在进行的程序。
线程:就是进程中一个负责程序执行的控制单元(执行路径)。
一个进程可以包含多个线程(多条执行路径),称为多线程。
一个程序中至少要有一个线程。
开启多个线程是为了同时运行多部分代码。
每一个线程都有自己要运行的内容,这个内容可以称为线程要执行的任务。

多线程好处与弊端:
好处:解决了多部分同时运行的问题。
弊端:线程太多会使得效率的降低。
其实应用程序的执行都是cpu在做的快速的切换完成的,这个切换时随机的。


JVM启动时就启动了多个线程,至少有两个线程可以分析出来:
1.执行main函数的线程,该线程的任务代码都定义在main函数中。
2.负责垃圾回收的线程。

protected void finalize() Throws Throwable
当垃圾回收器确定不存在对象的更多引用时,由对象的垃圾回收器调用此方法。
子类重写finalize方法,以配置系统资源或者执行其他清除。
static void gc();运行垃圾回收器,并调用finalize方法。
System.gc();//告诉垃圾回收器启动,但垃圾回收器不定时启动

创建新执行线程的两种方法:
1、一种方法是将类声明为Thread的子类,该子类应该重写Thread的run方法。
public void run()
步骤:定义一个类继承Thread类。
          覆盖Thread类的run方法。
         直接创建Thread子类对象创建线程。
         调用start方法开启线程并调用线程的任务run方法。

创建线程的目的是味蕾开启一条执行路径,去执行指定的代码和其他代码实现同时运行。
而运行的指定代码就是这个执行路径的任务。

jvm创建的主线程的任务都定义在了主函数中。

而自定义的线程它的任务在哪呢?
Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。
这个任务就通过Thread类中的run方法来体现,也就是说,run方法就是封装自定义线程运行任务的函数。
run方法中定义就是线程要运行的任务代码。
开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。
运行的代码定义在run方法中。
子类对象.start();java虚拟机调用该线程的run方法。

可以通过Thread的getName获取线程的名称,Thread-编号,从0开始。
static Thread currentThread();返回当前正在执行的线程对象的引用。
String getName();返回该线程的名称
long getId();返回该线程的标识符。

创建线程第二种方式:实现Runable接口

创建线程第二种方式:实现Runable接口1.定义类实现Runable接口2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为构造函数的参数进行传递。   为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。4.调用线程对象的start方法开启线程。public void run();  Runcable接口应该由哪些打算通过某一线程执行其实例的类来实现。使用独立独立的Runable实现Runable接口的好处:1.将线程的任务从线程的子类中分离出来,进行单独的封装。  按照面向对象的思想将任务的封装成对象。2.避免了java单继承的局限性。所以,创建线程的第二种方式较为常用。

class Thread{private Runnable r;Thread(){}Thread(Runnable r){thir.r=r;}public void run(){if(r!=null){r.run();}//调用子类的run方法}public void start(){run();}}class ThreadImp implements Runnable{public void run(){System.out.println("runnable run");}}class SubThread extends Thread{public void run(){System.out.println("haha");}}

class Bank{private int sum;public synchronized void add(int n){sum=sum+n;try{Thread.sleep(10);}catch (Exception e){}System.out.println("sum="+sum);}}

class Bank{private int sum;Object obj = new Object();public void add(int n){//同步代码块封装代码synchronized(obj){sum=sum+n;try{Thread.sleep(10);}catch (Exception e){}System.out.println("sum="+sum);}}}class Cus implements Runnable{private Bank b = new Bank();public void run(){for(int i=0;i<3;i++){b.add(100);}}}class BankDemo{public static void main(String[] args) {Cus c = new Cus();Thread t1 = new Thread(c);Thread t2 = new Thread(c);t1.start();t2.start();}}


0 0
原创粉丝点击