一、多进程:在操作系统中能(同时)运行多个任务(程序)
二、多线程:在同一个应用程序中有多个顺序流(同时)执行
方法1:
定义一个线程类,继承Thread重写run()方法,run()方法称为线程体
class FirstThread extends Thread{
public void run(){
for(int i = 0;i <20;i++){
System.out.println("fistthread--->"+i);
}
}
}
test
class ThreadTest{
public static void main(String[] args){
//生成了线程对象
FirstThread ft = new FirstThread();
//启动线程,并不一定会执行
ft.start();
for(int i = 0 ;i < 20;i++){
System.out.println("main---->" + i);
}
//ft.run();千万不能这样写
}
}
以上有两个线程,两个线程交错的没有规律的运行,没谱。。
方法2:
提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thead子类的线程对象师,把目标对象传递给这个线程实例,由该目标对象提供线程体
class RunnableImp implements Runnable{
public void run(){
for(int i = 0;i < 10;i++){
System.out.println("Runnable--->" + i);
}
}
}
test
class RunnableTest{
public static void main(String[] args){
//生成一个Runnalbe接口实现类的对象
RunnableImp ri = new RunnableImp();
Thread th = new Thread(ri);
th.start();
}
}
用的较多。
线程的简单控制方法:
中断线程
Thread.sleep() :休眠ms,之后进入就绪状态,能不能运行,就看它能不能抢占cpu
Thread.yield() :当前线程让出cpu,然后重新去抢占cpu
设置线程的优先级
setPriority(),getPriority()
class RunnableTest{
public static void main(String[] args){
//生成一个Runnalbe接口实现类的对象
RunnableImp ri = new RunnableImp();
//生成一个Thread对象,并将Runnable接口实现类的对象作为参数
//传递给该Thread对象
Thread t = new Thread(ri);
//线程的优先级最大10,最小1,可以使用Tread提供的静态常量来设置
t.setPriority(Thread.MAX_PRIORITY);
t.start();
System.out.println(t.getPriority);
}
}
优先级越高,抢cpu的 概率越高
class MyThread implements Runnable{
int i = 100;
public void run(){
while(true){
//Thread.currentThread()当前线程
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
test
class MyThreadTest{
public static void main(String [] args){
MyThread myThread = new MyThread();
//两个Thread对象公用一个线程体
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
//setName:设置线程的名字;getName:获取线程的名字
t1.setName("Thread a");
t2.setName("Thread b");
t1.start();
t2.start();
}
}
结果:
结果出现错误,原因:多线程共用同一份数据
解决方法:同步代码块,synchronized(){},一个线程a拿到同步锁之后,在执行程序的时候,有可能会切换到线程b,但是线程b没有同步锁,所以只能等待线程a把代码执行完,释放锁,然后两个线程又去抢占锁。