通过继承Thread实现多线程
用法:
FirstThread类继承Thread类:
// 继承一个Thread类
class FirstThread extends Thread{
// 覆盖run方法,run方法中就是线程执行的内容
public void run()
{
for(int i = 0 ; i < 100; i++)
{
System.out.println("first tread-->" + i);
}
}
}
Test类测试结果:
public class Test {
public static void main(String[] args) {
// 生成线程类的对象,这个对象代表一个线程
FirstThread ft = new FirstThread();
// 启动线程,进入就绪状态,不代表马上执行,还要抢占CPU,启动线程不能直接调用run,那就是在主线程中运行了
ft.start();
// 这个循环是在主线程中执行,执行后发现两个线程交替运行,而且无规律
for(int i = 0 ; i < 1200; i++)
{
System.out.println("main inread-->" + i);
}
}
}
通过实现Runnable接口实现多线程
用法:
mRunnable类实现Runnable接口
class mRunnable implements Runnable{
// 复写run方法,run方法内部是线程执行的内容
public void run()
{
for(int i = 0 ; i < 1200; i++)
{
// Thread的currentThread方法取得当前线程,getName方法是取得线程名
System.out.println(Thread.currentThread().getName() + i);
}
}
}
Test类测试结果:
public class Test {
public static void main(String[] args) throws InterruptedException {
// 初始化一个mRunnable对象
mRunnable r =new mRunnable();
// 把mRunnable对象以参数形式传给Thread的构造函数
Thread t = new Thread(r);
// 启动线程
t.start();
}
}
线程的一些常用方法
用法:
public class Test {
public static void main(String[] args) throws InterruptedException {
// 初始化一个mRunnable对象
mRunnable r =new mRunnable();
// 把mRunnable对象以参数形式传给Thread的构造函数
Thread t = new Thread(r);
// 设置线程优先级优先级从0-10,优先级大的只是被执行的概率大,不绝对
t.setPriority(10);
// 取得线程的优先级
int i = t.getPriority();
// 静态方法线程睡眠,以毫秒为单位,睡眠结束后不一定马上执行,还要经过抢占CPU阶段
Thread.sleep(3000);
// 静态方法让出CPU使用权,开始新一轮抢cpu,也许能在得到,也许别别的线程得到
Thread.yield();
// 启动线程,线程进入就绪状态开始抢占CPU使用权,得到后执行run方法里面代码
t.start();
}
}
简单的线程同步方法
用法:
两个线程所共用的代码
class RunnableIm implements Runnable{
public void run()
{
/**
* synchronized中为同步代码块,this是同步锁对象,A进来执行完所有代码块,锁才开,B才能执行,否则即使B得到CPU
* 使用权没有得到锁也得等下去,两个线程共用一个代码块时候为了防止数据不同步时候用。
*/
synchronized(this)
{
for(int i = 0 ; i < 1200; i++)
{
// 得到当前线程的名字
System.out.println(Thread.currentThread().getName() + i);
}
}
}
}
Test测试结果
public class Test {
public static void main(String[] args) throws InterruptedException
{
// 初始化一个mRunnable对象
RunnableIm r =new RunnableIm();
// 初始化两个线程
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
//启动两个线程,放入同步代码块的数据不会出现不一致情况
t1.start();
t2.start();
}
}