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

多线程好处与弊端:
好处:解决了多部分同时运行的问题。
弊端:线程太多会使得效率的降低。
其实应用程序的执行都是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();
	}
}