进程:正在进行的程序。
线程:就是进程中一个负责程序执行的控制单元(执行路径)。
一个进程可以包含多个线程(多条执行路径),称为多线程。
一个程序中至少要有一个线程。
开启多个线程是为了同时运行多部分代码。
每一个线程都有自己要运行的内容,这个内容可以称为线程要执行的任务。
多线程好处与弊端:
好处:解决了多部分同时运行的问题。
弊端:线程太多会使得效率的降低。
其实应用程序的执行都是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子类对象创建线程。
创建线程的目的是味蕾开启一条执行路径,去执行指定的代码和其他代码实现同时运行。
而运行的指定代码就是这个执行路径的任务。
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();
}
}