赞
踩
的几率大,但是不一定能抢占到.
一.
1.多线程:如果一个程序的执行路径有多条.
单线程:程序的执行路径只有一条
面试题:Jvm,java虚拟机是多线程程序吗?
是多线程程序,由于java虚拟机中自带一个垃圾回收器,来确保程序不会轻易的造成内存溢出!
至少开启两条子线程:
当前程序在执行代码的时候,会开启main:主线程
垃圾回收器会开启一个垃圾回收线程,来确保程序不会内存异常,将不用的变量或者没有更多引用的对象来回收掉!
例子:
- public class ThreadDemo {
-
- public static void main(String[] args) {
-
- System.out.println(new Object()) ;
- System.out.println(new Object()) ;
- System.out.println(new Object()) ;
- System.out.println(new Object()) ;
-
- //....中间创建了很多对象
- System.out.println(new Object()) ;
- }
- }
重点:如何实现多线程程序?
要实现多线程程序,必须创建一个进程,
创建进程需要调用系统资源进行创建,但是Java语言是不能直接调用系统资源
C/C++语言是可以创建系统资源,然后使用Java语言掉C/C++已经封装好的东西,
Java---->类:Thread类
并发和并行
并发:指的是同一个时间点
并行:指的的是一个时间段
多线程程序实现方式1:
1)自定一个类:MyThread 继承自Thread类
2)在MyThread类中重写Thread类中的run() :为什么重写run()
3)在主线程中,创建该类的实例对象,启动线程
例子:
- public class ThreadDemo {
-
- public static void main(String[] args) {
-
- //创建该线程的实例对象
- // MyThread my = new MyThread() ;
- //
- // //启动线程
- // /**
- // * 启动线程不是调用run()方法,
- // * strat()是线程开始执行的方法
- //run()方法调用相当于调用了一个普通方法,并不会出现线程随机性;而start()方法调用,
- //其实是通过Jvm调用线程中的run()来进行多个线程抢占CPU执行权
- // */
- // my.start() ;
- // //0java.lang.IllegalThreadStateException
- // /**
- // * 第二次启动线程,会出现:非法线程状态异常
- // * 当前my线程已经启动了,不能重新启动
- // */
- // my.start() ;
- // my.run() ;
- // my.run() ;
-
- MyThread my1 = new MyThread() ;
- MyThread my2 = new MyThread() ;
-
- //分别启动线程
- my1.start() ;
- my2.start() ;
- }
- }
- public class MyThread extends Thread {
-
-
- /*
- * 重写Thread类中的run()方法
- * */
- @Override
- public void run() {
- // System.out.println("helloworld");
- //耗时的操作,线程睡眠,线程等待,循环语句
- for(int x = 0 ; x <100 ; x ++){
- System.out.println(x);
- }
- }
- }
例子:
- public class ThreadDemo {
-
- public static void main(String[] args) {
-
- //创建线程类的实例
- //无参构造的形式
- // MyThread my1 = new MyThread() ;
- // MyThread my2 = new MyThread() ;
-
-
- //有参构造形式设置线程名称
- // MyThread my1 = new MyThread("高圆圆") ;
- // MyThread my2 = new MyThread("张杨") ;
-
- /*
- * 设置线程名称方式:无参+setName(String name)方法
- * */
- MyThread my1 = new MyThread() ;
- MyThread my2 = new MyThread() ;
-
- // public final void setName(String name)改变线程名称,使之与参数 name 相同。
- my1.setName("高圆圆") ;
- my2.setName("张杨") ;
-
- //public static Thread currentThread():表示正在运行的线程
- //默认所有的子线程的都在主线程中
- System.out.println(Thread.currentThread().getName());//main
-
- //启动线程
- my1.start() ;
- my2.start() ;
- }
- }
- /*
- *
- * public class Thread implements Runnable{
- * private char name[];
- *
- * public Thread() {
- * 初始化
- init(null, null, "Thread-" + nextThreadNum(), 0); //"Thread-" + nextThreadNum()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。