多线程学习

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


线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。


一个进程中至少有一个线程。

创建线程有两种方法,:

第一种方法:;

继承Thread类。
步骤:
1,定义类继承Thread。
2,复写Thread类中的run方法。
目的:将自定义代码存储在run方法。让线程运行。


3,调用线程的start方法,
该方法两个作用:启动线程,调用run方法。

class ThreadDemo extends Thread 
{	
	public void run()//使用新线程运行for循环中的代码
		{
			for (int x=0;x<10;x++ )
			{
				System.out.println("新线程"+x);//在控制台输出10条测试语句
			}
		}
	public static void main(String[] args) 
	{
		ThreadDemo t = new ThreadDemo();//创建Thread类的对象
		t.start();//调用Thread类的start()方法来启动新线程

	
		for (int x = 0;x<10 ;x++ )//在主线程中运行for循环中的代码
		{
			System.out.println("主线程"+x);//输出十条测试语句
		}
		
	}
}

第二种方法:

实现Runnable接口创建线程

步骤:

1,新建一个类,该类实现了Runnable接口并重写了run()方法,.run()方法中包含要在新线程中运行的代码

2,使用刚刚编写的类创建Runnablie接口类型的对象.

3,使用Thread类的构造方法创建Thread类的对象..

4 4,调用Tread类的start()方法来运行新线程

class RunnableDemo implements Runnable 
{	
	public void run()//使用新线程运行for循环中的代码
		{
			for (int x=0;x<10;x++ )
			{
				System.out.println("新线程"+x);//在控制台输出10条测试语句
			}
		}
	public static void main(String[] args) 
	{
		Runnable r = new RunnableDemo();//创建Runnable接口的对象
		Thread t = new Thread(r);//利用Runnable接口的对象创建Thread类对象

		t.start();//调用Thread类的start()方法来启动新线程
		for (int x = 0;x<10 ;x++ )//在主线程中运行for循环中的代码
		{
			System.out.println("主线程"+x);//输出十条测试语句
		}
		
	}
}
java仅支持单继承,创建大量的Tread类对象开销打

Runnable接口不存在这个问题,更加适用

继承Thread:线程代码存放在Thread子类run方法中.
实现Runnable:线程代码存放在接口的子类run中


线程的名称属性

默认名称样式:"Thread-数字"
可以使用 Thread类的getName()方法获取线程名称,setName()方法设置线程名称
getId()方法获取线程ID

线程的休眠:Thread类的sleep()方法可以让线程进入休眠状态.
class SleepDemo 
{
	public static void main(String[] args) 
	{
		long startTime = System.currentTimeMillis();//获取系统当前时间
		try
		{
			Thread.sleep(1000);//线程休眠1秒钟
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();//输出异常信息
		}
		long endTime = System.currentTimeMillis();//获取系统当前时间
		System.out.print("线程休眠时间是:");
		System.out.println(endTime - startTime+"毫秒");//获取线程休眠时间

	}
}
线程插队,可以使用Thread类的join()方法让另一个线程优先运行
class JoinDemo implements Runnable
{	
	public void run()//使用新线程运行for循环中的代码
		{
			for (int x=0;x<5;x++ )
			{
				System.out.println("新线程"+x);//在控制台输出10条测试语句
			}
		}
	public static void main(String[] args) 
	{
		Thread t = new Thread(new JoinDemo());//利用Runnable接口的对象创建Thread类的对象
		t.start();//调用Thread类的start()方法来启动新线程

		try
		{
			t.join();//让新线程插队运行
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();//输出异常信息
		}
		for (int x = 0;x<10 ;x++ )//在主线程中运行for循环中的代码
		{
			System.out.println("主线程"+x);//输出十条测试语句
		}
		
	}
}

线程停止可以用stop()方法来停止,由于此方法不安全,通常在run方法运行完毕后线程停止运行,或者可以使用布尔值来让线程提前停止

\

多线程具备随机性。因为是由cpu不断的快速切换造成的。就有可能会产生多线程的安全问题。
问题的产生的原因:
1,多线程代码中有操作共享数据。
2,多条语句操作该共享数据。
当具备两个关键点时,
有一个线程对多条操作共享数据的代码执行的一部分。还没有执行完,另一个线程开始参与执行。
就会发生数据错误。
Java就对这种解决方式提供了专业的代码。
同步
同步的原理:就是将部分操作功能数据的代码进行加锁。
同步方法::用synchronized关键字修饰的方法.

在使用synchronized关键字修饰run()方法后,在一个线程运行我完毕前,其他的线程并没有进入该方法.

线程应用在awt和swing的编程中,这点还没学习到.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值