java线程里面方法的执行顺序
publicclassxiansanimplementsRunnable{intb=100;publicsynchronizedvoidm1()throwsExcepti...
public class xiansan implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b = "+b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2000);
b = 2000;
// System.out.println("-----------------------m2-------");
// System.out.println(this.b);
//System.out.println(b+"jjjjjjjjjjjjjjjjjjjjjjjjj");
}
public void run() {
try {
m1();
} catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
xianer x = new xianer();
Thread t = new Thread(x);
// System.out.println(t.getPriority());
// System.out.println(Thread.currentThread().getPriority());
t.start();
x.m2();
System.out.println(x.b+"uuuuuuu");
// System.out.println(new Date(System.currentTimeMillis()));
}
}
通过测试,知道执行顺序是差不多m2->main->m1,不知道对不对,还有为什么t。start后,run方法不先执行呢,要等m2执行解锁后才运行,我觉得m1应该是最先的,我觉得应该 m1->m2
main
才对, 展开
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b = "+b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2000);
b = 2000;
// System.out.println("-----------------------m2-------");
// System.out.println(this.b);
//System.out.println(b+"jjjjjjjjjjjjjjjjjjjjjjjjj");
}
public void run() {
try {
m1();
} catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
xianer x = new xianer();
Thread t = new Thread(x);
// System.out.println(t.getPriority());
// System.out.println(Thread.currentThread().getPriority());
t.start();
x.m2();
System.out.println(x.b+"uuuuuuu");
// System.out.println(new Date(System.currentTimeMillis()));
}
}
通过测试,知道执行顺序是差不多m2->main->m1,不知道对不对,还有为什么t。start后,run方法不先执行呢,要等m2执行解锁后才运行,我觉得m1应该是最先的,我觉得应该 m1->m2
main
才对, 展开
4个回答
2015-12-08 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
这个程序的执行顺序不不一定的,它的执行顺序还跟线程分的时间片有关
CPU运算的时间 是分时间片 分给不同的线程的 一个线程执行完 或者用完了当前它分到的那个时间片 他就得让出CPU给其他线程使用啦!
线程化是允许多个活动共存于一个进程中的工具。大多数现代的操作系统都支持线程,而且线程的概念以各种形式已存在了好多年。Java 是第一个在语言本身中显式地包含线程的主流编程语言,它没有把线程化看作是底层操作系统的工具。
有时候,线程也称作轻量级进程。就象进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。
进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但您必须小心,确保它们不会妨碍同一进程里的其它线程。
Java 线程工具和 API 看似简单。但是,编写有效使用线程的复杂程序并不十分容易。因为有多个线程共存在相同的内存空间中并共享相同的变量,所以您必须小心,确保您的线程不会互相干扰。
每个 Java 程序都使用线程
每个 Java 程序都至少有一个线程 ― 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并在该线程中调用程序的 main() 方法。
JVM 还创建了其它线程,您通常都看不到它们 ― 例如,与垃圾收集、对象终止和其它 JVM 内务处理任务相关的线程。其它工具也创建线程,如 AWT(抽象窗口工具箱(Abstract Windowing Toolkit))或 Swing UI 工具箱、servlet 容器、应用程序服务器和 RMI(远程方法调用(Remote Method Invocation))。
CPU运算的时间 是分时间片 分给不同的线程的 一个线程执行完 或者用完了当前它分到的那个时间片 他就得让出CPU给其他线程使用啦!
线程化是允许多个活动共存于一个进程中的工具。大多数现代的操作系统都支持线程,而且线程的概念以各种形式已存在了好多年。Java 是第一个在语言本身中显式地包含线程的主流编程语言,它没有把线程化看作是底层操作系统的工具。
有时候,线程也称作轻量级进程。就象进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。
进程可以支持多个线程,它们看似同时执行,但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但您必须小心,确保它们不会妨碍同一进程里的其它线程。
Java 线程工具和 API 看似简单。但是,编写有效使用线程的复杂程序并不十分容易。因为有多个线程共存在相同的内存空间中并共享相同的变量,所以您必须小心,确保您的线程不会互相干扰。
每个 Java 程序都使用线程
每个 Java 程序都至少有一个线程 ― 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并在该线程中调用程序的 main() 方法。
JVM 还创建了其它线程,您通常都看不到它们 ― 例如,与垃圾收集、对象终止和其它 JVM 内务处理任务相关的线程。其它工具也创建线程,如 AWT(抽象窗口工具箱(Abstract Windowing Toolkit))或 Swing UI 工具箱、servlet 容器、应用程序服务器和 RMI(远程方法调用(Remote Method Invocation))。
展开全部
从输出结果来看呢,确实是m2-->main-->m1,
但是Thread.start(),此时线程处于就绪状态,并没有立即运行,
而是先运行Main线程(主线程),当主线程挂起的时候,Thread线程才开始运行,但是运行主线程的时候M2()方法已经把变量b锁住了,所以先运行M2()方法,如果不把M2()加锁的话,应该先运行M1()方法的。
package test;
public class problem10 implements Runnable {
int b = 10;
@Override
public void run() {
// TODO Auto-generated method stub
try {
m1();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized void m1() throws Exception
{
b = 1000;
Thread.sleep(1000);
System.out.println("M1 b="+b);
}
public void m2() throws Exception
{
Thread.sleep(5000);
b = 2000;
System.out.println("M2 b="+b);
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
problem10 prob = new problem10();
System.out.println("prob.b 1 = "+ prob.b);
Thread t = new Thread(prob);
t.start();
System.out.println("prob.b 2 = "+ prob.b);
prob.m2();
System.out.println("prob.b 3 = "+ prob.b);
}
}
执行结果如下
prob.b 1 = 10
prob.b 2 = 10
M1 b=1000
M2 b=2000
prob.b 3 = 2000
希望你能明白。
追问
我发现,我有点放迷糊了额 ,不确定m1先,还是m2先,因为这一句 System.out.println(x.b+"uuuuuuu");
运行多次,会发现结果不一样,这好像推翻了m2先的说法
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的顺序是不对的吧!执行顺序是:main->m2->run->m1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你搞笑吧,主线程都没运行,其他两线程能运行吗?
追问
如果主线程先运行,你说System.out.println(x.b+"uuuuuuu");
,这一句结果是什么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询