1、进程和线程
线程是进程当中的一个程序执行流程
2、多线程程序运行模式
注:下面的属于多线程,由于多线程之间速度切换很快,让我们感觉仿佛很多线程在同时执行.(抢占CPU的执行时间)
3、定义线程的方法
方式1;
定义一个线程类,它继承类Thread并重写其中的run()方法,run()方法被称为线程体.
(1)定义一个线程类FirstThread.java
class FirstThread extends Thread
{
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println("FirstThread-->"+i);
}
}
}
(2)定义一个类Test.java
class Test
{
public static void main(String arg[])
{
//生成线程类对象
FirstThread ft=new FirstThread();
//启动线程(如果写成ft.run()则没有启动一个新的线程,而是运行在主线程中)
ft.start();
for(int i=0;i<100;i++)
{
System.out.println("main-->"+i);
}
}
}
执行结果:
方式2:
提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体
(1)定义一个实现了Runnable接口的类 RunnableImpl.java
class RunnableImpl implements Runnable
{
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println("Runnble-->"+i);
}
}
}
(2)定义一个类Test.java
class Test
{
public static void main(String arg[])
{
//生成一个Runnable接口实现类的对象
RunnableImpl ri=new RunnableImpl();
//生成一个Thread对象,并将Runnable接口实现类的对象作为参数
//传递给该Thread对象
Thread t=new Thread(ri);
//通知Thread对象,执行start方法
t.start();
for(int i=0;i<100;i++)
{
System.out.println("main-->"+i);
}
}
}
4、线程的简单控制方法
(1)中断线程
-Thread.sleep()
-Thread.yield()
(2)设置线程的优先级(线程的最大优先级是10,最小是1)
-getPrioirty()
-setPriority()
5、多线程数据安全
(1)定义一个实现了runnable接口的类MyThread.java
class MyThread implements runnable
{
int i=100;
public void run()
{
while(true)
{
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0)
{
break;
}
}
}
}
(2)定义一个类Test.java
class Test
{
public static void main(String arg[])
{
MyThread myThread=new MyThread();
//生成两个Thread对象,但这两个Thread对象公用一个线程体
Thread t1=new Thread(myThread);
Thread t2=new Thread(myThread);
//每一个线程都有一个名字,可以通过setName()设置线程的名字,getName()获得名字
t1.setName("线程a");
t2.setName("线程b");
t1.start();
t2.start();
}
}
运行结果(运行多次会出现重复的):
6.线程同步的方法
(1)将上一个例子中的MyThread.java类修改为
class MyThread implements Runnable
{
int i=100;
public void run()
{
while(true)
{
synchronized(this){ //同步代码块
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
}
运行结果为(将不会出现重复的)