线程是一个程序内部的顺序控制流。
进程是由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread)。
线程和进程的区别:
每个进程都有独立的代码和数据空间(进程上下文)进程间的切换会有较大的开销。
线程可以看成是轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立 的运行栈和程序计数器,线程切换的开销小。
多进程:在操作系统中能同时运行多个任务(程序)
多线程:在同一应用程序中有多个顺序流同时执行
线程的创建和启动
可以由两种方式创建新的线程
第一种实现Runnable接口
pubilc class TestThread1
{
public static void main(String args[]
{
//实例化一个Runner1类的对象
Runner1 r1=new Runner1();
//实例化一个线程类的对象并将Runner1的实例化对象传入
Thread t=new Thread(r);
//启动线程
t.start();
System.out.println("线程一");
}
}
//实现Runnable接口
class Runner1 implements Runnable
{
//重写Runnable接口的run方法
public void run()
{
for(int i=0;i<1000;i++)
{
System.out.println("线程二"+i);
}
}
}
第二种继承Thread
public class TestThread1
{
public static void main(String args[])
{
//定义一个thread1的对象
thread1 t=new thread1();
//启动线程
t.start()
System.out.println("线程一");
}
}
//定义一个线程类的子类
class thread1 extends Thread
{
//重写线程类的run方法
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println("线程二"+i);
}
}
}
Sleep方法
sleep方法可以调用Thread的静态方法,使得当前线程休眠(暂时停止执行millis毫秒),由于是静态方法,sleep可以由类名直接调用。Thread.sleep(millis)
Join方法
合并某个线程,调用某线程的该方法,将当前线程与该线程‘合并’
Yield方法
让出CPU,给其他线程执行的机会。当前线程进入就绪队列等待调度。
线程的调度和优先级
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级来决定应调度(决定)哪个线程来执行。
线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5;getPriority()获得线程的优先级数;setPriority()设置线程的优先级数。
线程同步
同步:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。或者说内容保和按需要部分保持一致。
线程同步:是为了防止多个线程访问一个数据对象时,对数据造成的破坏。
线程同步方法:是通过锁来实现,每个对象都有一个隐含锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他同步
方法。
在Java中,关键字synchronized来与对象的互斥锁联系,当某个对象synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
Synchronized还可以放在方法声明中,表示整个方法为同步方法。线程睡眠时它所持的任何锁都不会释放。当程序运行到synchronized同步方法或代码块时该对象锁才起作用
Wait和Sleep区别
Wait时别的线程可以访问锁定对象
Sleep时别的线程也不可以访问锁定对象