V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
asanelder
V2EX  ›  程序员

Java 中对象和执行对象线程的割裂...

  •  
  •   asanelder · 2021-01-14 17:50:56 +08:00 · 2236 次点击
    这是一个创建于 1428 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 Java 中, 有对象, 和线程这两个概念, 对象虽然有数据和形为, 但对象本身不能执行, 要使用线程来执行.

    俺感受这和现实中的对象不匹配, 现实中有行为的对象一般都是可自运行的(比如说人)

    也就是现实中, 对象和执行对象的线程在绑定在一起的.

    Java 中编程模型和现实的不匹配导致写多线程程序时, 总是感觉不那么直观. 比如总要想这个对象的代码是在哪个线程中执行的.

    有没有那种库或语言可以把执行环境和对象进行绑定的啊...
    19 条回复    2021-01-15 11:04:55 +08:00
    wysnylc
        1
    wysnylc  
       2021-01-14 18:03:33 +08:00
    谁说现实里对象和执行对象的线程在绑定在一起,我用泡面碗泡茶不可以吗?
    lewis89
        2
    lewis89  
       2021-01-14 18:14:12 +08:00
    面向对象发明跟流行的时候,多核 CPU 还在工程师的美好憧憬中,Python 的 GIL 到现在都没去除呢,想那么多干嘛
    acmore
        3
    acmore  
       2021-01-14 18:38:32 +08:00
    "对象本身的执行" 在现实中也不存在,程序应该类比于人的 DNA,现实中 DNA 一样不能自己运行,需要人这个载体来执行,人就是线程。"执行" 这个概念本身就是有执行能力的使动方执行某种可执行的规范,代码是规范,线程是运行起来的规范,这一切都非常自然。

    达到 "把执行环境和对象进行绑定" 这种效果在 Java 中就可以做,把执行逻辑和 Executor 放一起就好了,然后外部调用。计算机中不存在一个对象天然地就能执行,这是操作系统的基础:代码只是块设备中的字节而已,总要有进程和线程来执行它。
    TypeError
        4
    TypeError  
       2021-01-14 19:09:03 +08:00 via Android
    golang 啊,一个 go 关键词自动创建 goroutine 调度后台运行,
    不用自己思考太多,除非存在数据同步需要用 channel 或者锁
    Kirsk
        5
    Kirsk  
       2021-01-14 19:21:58 +08:00 via Android   ❤️ 1
    假设对象与线程绑定 是不是一线程一对象 楼主说的执行环境更像是上下文 本质不还是对象吗
    sun2920989
        6
    sun2920989  
       2021-01-14 19:23:10 +08:00
    我怀疑你在说 erlang.但是我证据不充分.
    secondwtq
        7
    secondwtq  
       2021-01-14 19:27:19 +08:00
    你说的不是 Actor Model 么 ...
    kaneg
        8
    kaneg  
       2021-01-14 19:49:40 +08:00 via iPhone
    貌似 golang 的 go 关键词是你想要的东西:语法层面提供异步执行的能力。
    asanelder
        9
    asanelder  
    OP
       2021-01-14 21:24:17 +08:00
    @wysnylc #1 666
    @lewis89 #2 就是想想而已
    @acmore #3 嗯, 放一个 executor 可以, 俺想看看有没有现成的方案
    @TypeError #4
    @kaneg #8 嗯, 不了解 go, 看来需要学习一下了
    @secondwtq #7 似乎就是这样啊
    cs419
        10
    cs419  
       2021-01-14 21:41:06 +08:00
    想这个对象的代码是在哪个线程中执行的 ??
    摸摸脑袋,没看懂

    这里说 Java 中 对象 要由线程来执行
    那么 哪个语言中 对象不是由线程来执行
    xuanbg
        11
    xuanbg  
       2021-01-15 00:56:05 +08:00
    面向对象本来很简单,就是逻辑和数据统一嘛,挺好的。结果呢,非要把自己搞成形而上学,导致问题一大堆。
    340244120w
        12
    340244120w  
       2021-01-15 06:22:55 +08:00 via iPhone
    脏读 换读 重复读 不就是现实里的问题咩。。
    不过,你也可以程序限制成只有一条线程执行,就完全能和你以为的现实生活对应上了。
    watzds
        13
    watzds  
       2021-01-15 08:54:52 +08:00 via Android
    现实中,对象挺难找的
    jorneyr
        14
    jorneyr  
       2021-01-15 09:17:31 +08:00
    有没有那种库或语言可以把执行环境和对象进行绑定的啊...

    Qt 就是这么做的,这才真的难受,一不小心就把程序搞崩溃了!
    ychost
        15
    ychost  
       2021-01-15 09:22:21 +08:00
    来个 async/await 语法就不会这么想了
    passerbytiny
        16
    passerbytiny  
       2021-01-15 09:31:37 +08:00 via Android
    现实中有行为的对象一般都是可自运行的(比如说人) —— 这种人是具有高度自我管理能力的人,把它放到办公桌前(甚至都不用放,给个眼神就行)它就会自启动工作模式。

    你确定存在上面那种“人”?

    执行对象的线程,本身就是对象,它们只是分工不同的对象,并不是割裂的两种东西。Java 里面线程就是用对象抽象的,我不知道楼主是怎么得出第一段那个对线程的看法的。
    no1xsyzy
        17
    no1xsyzy  
       2021-01-15 09:44:30 +08:00
    说到 Actor model
    Pony 是面向对象的 actor model 异步
    对象里可以定义 method 和 behavior
    behavior 一旦调用就会建立新的…… “线程” —— 如果你高兴这么叫的话
    acmore
        18
    acmore  
       2021-01-15 10:57:46 +08:00
    即使是 Actor 或者是 CSP 模型也一样,你写的代码只是被运行的规范,背后还是会有一堆执行者(操作系统线程)来运行这些规范。
    misaka19000
        19
    misaka19000  
       2021-01-15 11:04:55 +08:00
    瞎类比
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   875 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:30 · PVG 04:30 · LAX 12:30 · JFK 15:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.