黑马程序员——JAVA基础之简述多线程,两种创建多线程的方式

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

多线程:

 

进程和线程:

进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
一个进程中至少有一个线程。

 

主线程:

Java VM  启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称之为主线程。
扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。

 

 

创建线程方式一:继承Thread类

步骤:
1.  定义类继承Thread,建立子类对象的同时线程也被创建。

2.  子类覆盖父类中的run方法,将线程运行的代码存放在run中。目的:将自定义代码存储在run方法。让线程运行。
3.  通过调用start方法开启线程。该方法有两个作用:启动线程,调用run( )方法。

 

多线程原理:

多个线程都获取cpu的执行权。cpu执行到谁,谁就运行。

明确一点,在某一个时刻,只能有一个程序在运行。(多核除外)

cpu在做着快速的切换,以达到看上去是同时运行的效果。我们可以形象把多线程的运行行为在互相抢夺cpu的执行权。 
这就是多线程的一个特性:随机性。谁抢到谁执行,至于执行多长,cpu说的算。 

 
为什么要覆盖run方法?
Thread类用于描述线程。该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。也就是说Thread类中的run方法,用于存储线程要运行的代码。

 

/**
 * 
 * 此程序初步演示多线程的创建问题
 * 		主线程和两个多线程一起运行
 * 1.继承Thread类
 * 2.覆写run()方法
 * 3.start()调用
 *
 */
public class ThreadDemo 
{
	public static void main(String[] args)
	{
		//开启两个Demo线程
		Demo d = new Demo("zhangsan");
		Demo e = new Demo("lisi");
		d.start();//启动线程,调用run()方法。
		e.start();
		
		//主线程运行,打印    main.1——1000的数
		for (int i=1;i<=1000;i++)
		{
			System.out.println("main"+"."+i);
		}
	}
}

//定义一个Demo类用于开启多线程,继承Thread
class Demo extends Thread
{
	private String name;
	Demo(String name)
	{
		this.name = name;
	}
	//函数功能,打印     名字。1——1000的数
	public void run()
	{
		for (int i=1;i<=1000;i++)
		{
			System.out.println(name+"."+i);
		}
	}
}


经典卖票程序:

 

/**
 * 
 * 用Thread来初步示例多线程卖票程序
 * 		4个窗口,同时卖100张票
 *
 */
public class TicDemo 
{
	public static void main(String[] args)
	{
		//创建4个线程对象
		Tic t1 = new Tic();
		Tic t2 = new Tic();
		Tic t3 = new Tic();
		Tic t4 = new Tic();
		
		//开启4个线程并且运行
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

//声明一个类,继承Thread。
class Tic extends Thread
{
	private static int tic = 100;//继承Thread方法下,共享100张票,要用静态。
	
	public void run()
	{
		while (tic>0)
		{
			System.out.println(Thread.currentThread().getName()+"------"+tic--);
		}
	}
}


 

创建线程方式二:

实现Runnable接口

1.  定义类实现Runnable接口,将线程要运行的代码存放在该run方法中。

2.  子类覆盖接口中的run方法。
3.  通过Thread类创建线程对象。

4.  将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。

5.  调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。 

 

还是用卖票程序来演示:

 

/**
 * 
 * 用Runnable来初步示例多线程卖票程序
 * 		4个窗口,同时卖100张票
 *
 */
public class TicDemo 
{
	public static void main(String[] args)
	{
		//创建一个线程对象
		Tic t = new Tic();
		
		//创建4个线程,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
			
		//开启4个线程并且运行
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

//声明一个类,实现Runnable接口
class Tic implements Runnable
{
	private int tic = 100;
	
	public void run()
	{
		while (tic>0)
		{
			System.out.println(Thread.currentThread().getName()+"------"+tic--);
		}
	}
}


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

 

 

 

原文地址:https://www.cnblogs.com/runwind/p/4212197.html