进行多线程编程时,不要忘记了Java程序运行是从主线程开始,main方法就是主线程的线程执行内容。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化对象 MyThread myThread=new MyThread("陈箫阳"); //开启子线程,调用Start方法切记不要调用Run方法 myThread.start(); for(int x=0; x<50; x++){ System.out.println("main"+x); } //获取子线程名字 System.out.println(myThread.getName()); //获取主线程名字 System.out.println(Thread.currentThread().getName()); } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化对象 MyThread myThread=new MyThread("陈箫阳"); //开启子线程,调用Start方法切记不要调用Run方法 myThread.start(); for(int x=0; x<50; x++){ System.out.println("main"+x); } //获取子线程名字 System.out.println(myThread.getName()); //获取主线程名字 System.out.println(Thread.currentThread().getName()); } }
public class MyThread extends Thread{ public MyThread(String name){ super(name); } @Override public void run() { for(int x=0; x<50; x++){ System.out.println("Thread"+x); Log.i("thread","==="+x); } } }
是为了建立程序单独的执行路径,让多部分代码实现同时执行。也就是说线程创建并执行需要给定线程要执行的任务。
对于之前所讲的主线程,它的任务定义在main函数中。自定义线程需要执行的任务都定义在run方法中。
Thread类run方法中的任务并不是我们所需要的,只有重写这个run方法。既然Thread类已经定义了线程任务的编写位置(run方法),那么只要在编写位置(run方法)中定义任务代码即可。所以进行了重写run方法动作。
1、定义类实现Runnable接口
2、覆盖接口中的run方法
3、创建Thread类的对象
4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数
5、调用Thread类的start方法开启线程
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建线程执行目标类对象 Runnable runnable = new MyRunnable(); //将Runnable接口的子类对象作为参数传递给Thread类的构造函数 Thread thread = new Thread(runnable); Thread thread2 = new Thread(runnable); //开启线程 thread.start(); thread2.start(); for (int i = 0; i < 10; i++) { System.out.println("main线程:正在执行!" + i); } } }
public class MyThread implements Runnable { //定义线程要执行的run方法逻辑 @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("我的线程:正在执行!" + i); } } }
创建Thread类的对象,只有创建Thread类的对象才可以创建线程。线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。
在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资源不足,需要采取一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务。线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使用应用程序响应更快。另外,通过适当的调整线程中的线程数目可以防止出现资源不足的情况。
public class MyCallable implements Callable{ @Override public String call() throws Exception { Thread. sleep( 2000); System. out.println( "MyCallable"); System. out.println(Thread. currentThread().getName()); System. out.println( "Callable"); return null; } }
public class MyRunnable implements Runnable{ @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); System.out.println("Runnable"); } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //创建线程池对象 ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象 //创建Runnable实例对象 MyRunnable myRunnable = new MyRunnable(); //自己创建线程对象的方式 //Thread t = new Thread(r); //t.start(); ---> 调用MyRunnable中的run() //从线程池中获取线程对象,然后调用MyRunnable中的run() service.submit(myRunnable); //再获取个线程对象,调用MyRunnable中的run() service.submit(myRunnable); service.submit(myRunnable); service.submit(myRunnable); //注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中 //创建Callable实例对象 MyCallable myCallable = new MyCallable(); //从线程池中获取线程对象,然后调用MyRunnable中的run() service.submit(myCallable); //再获取个教练 service.submit(myCallable); service.submit(myCallable); //关闭线程池 service.shutdown(); } }
使用线程的内匿名内部类方式,可以方便的实现每个线程执行不同的线程任务操作。
方式1:创建线程对象时,直接重写Thread类中的run方法
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread() { @Override public void run() { for (int x = 0; x < 50; x++) { Log.i("Thread", "===" + x); } } }.start(); for (int x = 0; x < 50; x++) { Log.i("Thread", "===" + x); } } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Runnable runnable = new Runnable() { @Override public void run() { for (int x = 0; x < 50; x++) { Log.i("Thread", "===" + x); } } }; Thread thread = new Thread(runnable); thread.start(); for (int x = 0; x < 50; x++) { Log.i("Thread", "===" + x); } } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { for (int x = 0; x < 50; x++) { Log.i("Thread", "===" + x); } } }).start(); for (int x = 0; x < 50; x++) { Log.i("Thread", "===" + x); } } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224660.html原文链接:https://javaforall.net
