目录
一、继承Thread类
public class WorkThread extends Thread
{
//表示线程的可执行方法
@Override
public void run()
{
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"-->执行run方法"+ new Date());
}
}
//--------------------------------------------------------------------------
public class Test1
{
public static void main(String[] args)
{
System.out.println("线程名字:"+Thread.currentThread().getName() );
//创建线程类对象
WorkThread wt = new WorkThread();
//方法调用
//main-->执行run方法
wt.run();
//JVM无序调度
//wt.setName("线程一");
//wt.start();
}
}
二、继承Runnable接口
public class UserRunnable implements Runnable
{
@Override
public void run()
{
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+",在运行run方法");
}
}
//----------------------------------------------------------------------------------
public class Test1
{
public static void main(String[] args)
{
//1.构建了实现Runnbale接口对象
UserRunnable r = new UserRunnable();
//2.实现Runnbale接口对象r构建成Thread类对象
Thread t = new Thread(r);
Thread t1 = new Thread(r);
//3.使用Thread类的start()方法,启动一个线程
t.setName("线程一");
t1.setName("线程二");
t.start();
t1.start();
}
}
三、继承TimerTask
public class Tthread extends TimerTask
{
@Override
public void run()
{
// TODO Auto-generated method stub
System.out.println(new Date());
}
}
//-------------------------------------------------------------------
public class test
{
public static void main(String[] args)
{
// 定时器
Timer timer = new Timer();
// 线程任务
Tthread thread = new Tthread();
/*
* 启动定时线程 schedule(线程任务对象,延迟时间,间隔时间)
*/
timer.schedule(thread, 5, 1000);
// 延迟五秒后开启线程,开启后每一秒中执行一次。
}
}
四、继承Callable接口
public class UserRunn implements Callable
{
@Override
public Object call() throws Exception
{
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+",Callable线程启动");
String name="张三";
return name+"完成测试";
}
}
//--------------------------------------------------------------------------------------
public class Test
{
public static void main(String[] args)
{
FutureTask ft = new FutureTask(new UserRunn());
new Thread(ft).start();
try
{ //输出返回值
System.out.println(ft.get());
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Console:Thread-0,Callable线程启动
张三完成测试
五、线程池创建线程(JDK内置的线程池)
使用线程池创建线程的原因:当反复使用线程对象,可以不必多次创建线程对象,控制内存开销
public class Test
{
public static void main(String[] args)
{
/*
* 可缓存的线程池:如果线程池的大小超过了处理任务所需要的线程,
* 那么就会回收部分空闲( 60 秒不执行任务)的线程,
* 当任务数增加时,此线程池又可以智能的添加新线程来处理任务。
* 此线程池不会对线程池大小做限制,
* 线程池大小完全依赖于操作系统(或者说 JVM )能够创建的最大线程大小。
*/
ExecutorService servicePool = Executors.newCachedThreadPool();
/*
* 2、固定大小的线程池:每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
* 线程池的大小一旦达到最大值就会保持不变,
* 如果某个线程因为执行异常而结束,那么线程池会补充一个新线程线。
*/
//ExecutorService servicePool = Executors.newFixedThreadPool(2);
/*
* 3、单线程的线程池:这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。
* 如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。
* 此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
*/
//ExecutorService servicePool = Executors.newSingleThreadExecutor();
for(int i=0;i<4;i++)
{
int index=i;
servicePool.execute(()->{
System.out.println(Thread.currentThread().getName()+"输出:"+index);
try
{
Thread.sleep(1*2000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
});
}
}
}
public class Test
{
public static void main(String[] args)
{
//4.定时线程池
ScheduledExecutorService servicePool = Executors.newScheduledThreadPool(2);
servicePool.scheduleAtFixedRate(()->{
System.out.println(Thread.currentThread().getName()+",正在执行"+new Date());
}, 1, 5, TimeUnit.SECONDS);
}
}