java并发线程代码,编写java线程类
00-1010 1.线程和进程2。线程的创建和操作
00-1010进程是代码在数据集上的运行活动,是系统中资源分配和调度的基本单位。线程是一个实体。一个进程中至少有一个线程,是CPU调度和分配的基本单位。一个进程中的多个线程共享一个进程的资源。
进程的三个特征:
动态性 :是一个正在运行的程序,需要动态占用内存、CPU、网络等资源。独立性 : 和进程是相互独立的,都有自己独立的内存区域。如果并发性 :CPU是单核的,那么实际上只有一个进程同时在内存中执行。CPU会及时轮询切换,依次为各个进程服务,因为切换速度非常快,给我们的感觉是这些进程在同时执行,这就是并发。
目录
我们在进程中创建线程的方式有三种:
方式一:如何继承线程类1?定义一个线程类来继承线程类。2.覆盖run()方法3。创建新的线程对象。4.调用thread对象的start()方法启动线程。启动后的类ThreadDemo {//Threaddemo被当作一个进程。//main方法由主线程执行。据了解,main方法是一个主线程公共静态void main (string [] args) {//3。创建一个线程对象Thread t=new MyThread();//4.调用thread对象的start()方法启动线程,最后执行run()方法!t . start();for(int I=0;i 100I ){ System.out.println(主线程输出: I );} }}//1.定义一个线程类来继承线程类。类MyThread扩展了Thread{ //2。Override run()方法@Override public void run() {//线程的执行方法。for(int I=0;i 100I ){ System.out.println(子线程输出: I );} } }优点:编码很简单,只需要在run()方法中获取当前线程并直接使用这个,不需要使用Thread.currentThread()方法。缺点:Thread类继承了Thread类,不能继承其他类。功能不能通过继承来扩展(单一继承的限制)。另外,任务与代码没有分离,多线程执行同一任务时需要多个任务代码。
小结:
类是继承Thread的类。开始线程必须调用start()方法。多线程抢占CPU的执行,所以会有一种在执行过程中通过并发随机性方式二:实现Runnable接口的方法。
1.创建一个线程任务类来实现Runnable接口。2.覆盖run()方法3。创建线程任务对象。4.将线程任务对象包装成线程对象5。调用thread对象的start()方法启动线程。class thread demo { public static void main(string[]args){//3。创建线程任务对象(注意:线程任务对象不是线程对象,只是线程的任务)Runnable target=new my Runnable();//4.将线程任务对象包装成一个线程对象。并且可以指定线程名。//Thread t=新线程(目标);Thread t=新线程(target, thread 1 );//5.调用thread对象的start()方法启动线程t . start();线程t2=新线程(目标);//调用thread对象的start()方法启动线程T2 . start();for(int I=0;i 10I){ system . out . println(thread . current thread()。getName()== I);} }}//1.创建一个线程任务类来实现Runnable接口。MyRunnable类实现Runnable{
// 2.重写run()方法 @Override public void run() { for(int i = 0 ; i < 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+"==>"+i); } }}优点:
线程任务类只是实现了Runnable接口,可以继续继承其他类,而且可以继续实现其他接口(避免了单继承的局限性)。 同一个线程任务对象可以被包装成多个线程对象,适合多个多个线程去共享同一个资源。实现解耦操作,线程任务代码可以被多个线程共享,线程任务代码和线程独立。
方法三:实现Callable接口
1.定义一个线程任务类实现Callable接口 , 申明线程执行的结果类型。2.重写线程任务类的call方法,这个方法可以直接返回执行的结果。3.创建一个Callable的线程任务对象。4.把Callable的线程任务对象包装成一个FutureTask对象。5.把FutureTask对象包装成线程对象。6.调用线程的start()方法启动线程 。
public class ThreadDemo { public static void main(String[] args) { // 3.创建一个Callable的线程任务对象 Callable call = new MyCallable(); // 4.把Callable任务对象包装成一个未来任务对象 // -- public FutureTask(Callable<V> callable) // 未来任务对象是啥,有啥用? // -- 未来任务对象其实就是一个Runnable对象:这样就可以被包装成线程对象! // -- 未来任务对象可以在线程执行完毕之后去得到线程执行的结果。 FutureTask<String> task = new FutureTask<>(call); // 5.把未来任务对象包装成线程对象 Thread t = new Thread(task); // 6.启动线程对象 t.start(); for(int i = 1 ; i <= 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+" => " + i); } // 在最后去获取线程执行的结果,如果线程没有结果,让出CPU等线程执行完再来取结果 try { String rs = task.get(); // 获取call方法返回的结果(正常/异常结果) System.out.println(rs); } catch (Exception e) { e.printStackTrace(); } }}// 1.创建一个线程任务类实现Callable接口,申明线程返回的结果类型class MyCallable implements Callable<String>{ // 2.重写线程任务类的call方法! @Override public String call() throws Exception { // 需求:计算1-10的和返回 int sum = 0 ; for(int i = 1 ; i <= 10 ; i++ ){ System.out.println(Thread.currentThread().getName()+" => " + i); sum+=i; } return Thread.currentThread().getName()+"执行的结果是:"+sum; }}
优点: 线程任务类只是实现了Callable接口,可以继续继承其他类,而且可以继续实现其他接口(避免了单继承的局限性)。 同一个线程任务对象可以被包装成多个线程对象,适合多个多个线程去共享同一个资源。实现解耦操作,线程任务代码可以被多个线程共享,线程任务代码和线程独立。最关键的是能直接得到线程执行的结果。
到此这篇关于Java并发编程之线程创建的文章就介绍到这了,更多相关Java 线程创建内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。