进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
线程的休眠:Thread类的sleep()方法可以让线程进入休眠状态.
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。
一个进程中至少有一个线程。
创建线程有两种方法,:
第一种方法:;
继承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);//输出十条测试语句
}
}
}
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+"毫秒");//获取线程休眠时间
}
}
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就对这种解决方式提供了专业的代码。
同步
同步的原理:就是将部分操作功能数据的代码进行加锁。
问题的产生的原因:
1,多线程代码中有操作共享数据。
2,多条语句操作该共享数据。
当具备两个关键点时,
有一个线程对多条操作共享数据的代码执行的一部分。还没有执行完,另一个线程开始参与执行。
就会发生数据错误。
Java就对这种解决方式提供了专业的代码。
同步
同步的原理:就是将部分操作功能数据的代码进行加锁。
同步方法::用synchronized关键字修饰的方法.
在使用synchronized关键字修饰run()方法后,在一个线程运行我完毕前,其他的线程并没有进入该方法.